diff options
| -rw-r--r-- | src/pugixml.cpp | 8 | ||||
| -rw-r--r-- | tests/test_xpath_paths.cpp | 23 | 
2 files changed, 27 insertions, 4 deletions
| diff --git a/src/pugixml.cpp b/src/pugixml.cpp index e9ab09d..5c7fb6d 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -8705,7 +8705,7 @@ PUGI__NS_BEGIN  				while (cur && !cur.next_sibling()) cur = cur.parent();  				cur = cur.next_sibling(); -				for (;;) +				while (cur)  				{  					if (step_push(ns, cur, alloc) & once)  						return; @@ -8733,7 +8733,7 @@ PUGI__NS_BEGIN  				while (cur && !cur.previous_sibling()) cur = cur.parent();  				cur = cur.previous_sibling(); -				for (;;) +				while (cur)  				{  					if (cur.last_child())  						cur = cur.last_child(); @@ -8916,7 +8916,7 @@ PUGI__NS_BEGIN  					if (it->node())  						step_fill(ns, it->node(), stack.result, once, v); -					else if (axis_has_attributes) +					else if (axis_has_attributes && it->attribute() && it->parent())  						step_fill(ns, it->attribute(), it->parent(), stack.result, once, v);  					apply_predicates(ns, size, stack); @@ -8926,7 +8926,7 @@ PUGI__NS_BEGIN  			{  				if (c.n.node())  					step_fill(ns, c.n.node(), stack.result, once, v); -				else if (axis_has_attributes) +				else if (axis_has_attributes && c.n.attribute() && c.n.parent())  					step_fill(ns, c.n.attribute(), c.n.parent(), stack.result, once, v);  				apply_predicates(ns, 0, stack); diff --git a/tests/test_xpath_paths.cpp b/tests/test_xpath_paths.cpp index d791cdf..f1d52ad 100644 --- a/tests/test_xpath_paths.cpp +++ b/tests/test_xpath_paths.cpp @@ -616,4 +616,27 @@ TEST_XML(xpath_paths_optimize_step_once, "<node><para1><para2/><para3/><para4><p      CHECK_XPATH_BOOLEAN(doc, STR("//@attr5/following::para6"), true);      CHECK_XPATH_STRING(doc, STR("name(//@attr5/following::para6)"), STR("para6"));  } + +TEST_XML(xpath_paths_null_nodeset_entries, "<node attr='value'/>") +{ +    xpath_node nodes[] = +    { +        xpath_node(doc.first_child()), +        xpath_node(xml_node()), +        xpath_node(doc.first_child().first_attribute(), doc.first_child()), +        xpath_node(xml_attribute(), doc.first_child()), +        xpath_node(xml_attribute(), xml_node()), +    }; + +    xpath_node_set ns(nodes, nodes + sizeof(nodes) / sizeof(nodes[0])); + +    xpath_variable_set vars; +    vars.set(STR("x"), ns); + +    xpath_node_set rs = xpath_query("$x/.", &vars).evaluate_node_set(xml_node()); + +    CHECK(rs.size() == 2); +    CHECK(rs[0] == nodes[0]); +    CHECK(rs[1] == nodes[2]); +}  #endif | 
