Commit 8151c0ef authored by Stefan Behnel's avatar Stefan Behnel

fix declaration analysis (and type inference) for comprehensions

parent ea3d3f55
...@@ -3631,14 +3631,13 @@ class ComprehensionNode(ExprNode): ...@@ -3631,14 +3631,13 @@ class ComprehensionNode(ExprNode):
def infer_type(self, env): def infer_type(self, env):
return self.target.infer_type(env) return self.target.infer_type(env)
def analyse_declarations(self, env):
self.append.target = self # this is used in the PyList_Append of the inner loop
self.loop.analyse_declarations(env)
def analyse_types(self, env): def analyse_types(self, env):
self.target.analyse_expressions(env) self.target.analyse_expressions(env)
self.type = self.target.type self.type = self.target.type
self.append.target = self # this is a CloneNode used in the PyList_Append in the inner loop
# We are analysing declarations to late.
self.loop.target.analyse_target_declaration(env)
env.infer_types()
self.loop.analyse_declarations(env)
self.loop.analyse_expressions(env) self.loop.analyse_expressions(env)
def calculate_result_code(self): def calculate_result_code(self):
......
...@@ -725,6 +725,11 @@ property NAME: ...@@ -725,6 +725,11 @@ property NAME:
self.seen_vars_stack.pop() self.seen_vars_stack.pop()
return node return node
def visit_ComprehensionNode(self, node):
self.visitchildren(node)
node.analyse_declarations(self.env_stack[-1])
return node
# Some nodes are no longer needed after declaration # Some nodes are no longer needed after declaration
# analysis and can be dropped. The analysis was performed # analysis and can be dropped. The analysis was performed
# on these nodes in a seperate recursive process from the # on these nodes in a seperate recursive process from the
......
...@@ -25,7 +25,6 @@ class MarkAssignments(CythonTransform): ...@@ -25,7 +25,6 @@ class MarkAssignments(CythonTransform):
if isinstance(lhs, (ExprNodes.NameNode, Nodes.PyArgDeclNode)): if isinstance(lhs, (ExprNodes.NameNode, Nodes.PyArgDeclNode)):
if lhs.entry is None: if lhs.entry is None:
# TODO: This shouldn't happen... # TODO: This shouldn't happen...
# It looks like comprehension loop targets are not declared soon enough.
return return
lhs.entry.assignments.append(rhs) lhs.entry.assignments.append(rhs)
elif isinstance(lhs, ExprNodes.SequenceNode): elif isinstance(lhs, ExprNodes.SequenceNode):
......
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