Commit ebbc53de authored by Xavier Thompson's avatar Xavier Thompson

Bugfix: Fix cpp iteration over attribute of temporary object

parent 7622061d
......@@ -293,6 +293,23 @@ def translate_double_cpp_exception(code, pos, lhs_type, lhs_code, rhs_code, lhs_
code.putln(code.error_goto(pos))
code.putln('}')
# Used to determine if a node has a persistent result, meaning it is not temporary
# and doesn't depend on any temporary sub expressions.
# Examples:
# name # <- persistent
# name.attr # <- persistent
# some_func() # <- temporary
# some_func().attr # <- temporary
# Essentially this boils down to NameNodes and AttributeNodes that are recursively
# only composed of NameNodes.
def is_persistent(node):
if node.is_name:
return True
elif node.is_attribute:
return is_persistent(node.obj)
else:
return False
class ExprNode(Node):
# subexprs [string] Class var holding names of subexpr node attrs
......@@ -2920,7 +2937,7 @@ class CppIteratorNode(ExprNode):
if sequence_type.is_cyp_class:
self.cpp_attribute_op = "->"
# essentially 3 options:
if self.sequence.is_name or self.sequence.is_attribute:
if is_persistent(self.sequence):
# 1) is a name and can be accessed directly;
# assigning to it may break the container, but that's the responsibility
# of the user
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment