Commit d3c79c9b authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Disable array literals outside of pointer declaration

parent 9b19cce7
...@@ -935,7 +935,7 @@ class NameNode(AtomicExprNode): ...@@ -935,7 +935,7 @@ class NameNode(AtomicExprNode):
is_name = True is_name = True
is_cython_module = False is_cython_module = False
cython_attribute = None cython_attribute = None
skip_assignment_decref = False lhs_of_first_assignment = False
entry = None entry = None
def create_analysed_rvalue(pos, env, entry): def create_analysed_rvalue(pos, env, entry):
...@@ -1156,6 +1156,10 @@ class NameNode(AtomicExprNode): ...@@ -1156,6 +1156,10 @@ class NameNode(AtomicExprNode):
entry = self.entry entry = self.entry
if entry is None: if entry is None:
return # There was an error earlier return # There was an error earlier
if (self.entry.type.is_ptr and isinstance(rhs, ListNode)
and not self.lhs_of_first_assignment):
error(self.pos, "Literal list must be assigned to pointer at time of declaration")
# is_pyglobal seems to be True for module level-globals only. # is_pyglobal seems to be True for module level-globals only.
# We use this to access class->tp_dict if necessary. # We use this to access class->tp_dict if necessary.
...@@ -1200,7 +1204,7 @@ class NameNode(AtomicExprNode): ...@@ -1200,7 +1204,7 @@ class NameNode(AtomicExprNode):
#print "...from", rhs ### #print "...from", rhs ###
#print "...LHS type", self.type, "ctype", self.ctype() ### #print "...LHS type", self.type, "ctype", self.ctype() ###
#print "...RHS type", rhs.type, "ctype", rhs.ctype() ### #print "...RHS type", rhs.type, "ctype", rhs.ctype() ###
if not self.skip_assignment_decref: if not self.lhs_of_first_assignment:
if entry.is_local and not Options.init_local_none: if entry.is_local and not Options.init_local_none:
initalized = entry.scope.control_flow.get_state((entry.name, 'initalized'), self.pos) initalized = entry.scope.control_flow.get_state((entry.name, 'initalized'), self.pos)
if initalized is True: if initalized is True:
...@@ -1223,7 +1227,7 @@ class NameNode(AtomicExprNode): ...@@ -1223,7 +1227,7 @@ class NameNode(AtomicExprNode):
import Buffer import Buffer
Buffer.put_assign_to_buffer(self.result(), rhstmp, buffer_aux, self.entry.type, Buffer.put_assign_to_buffer(self.result(), rhstmp, buffer_aux, self.entry.type,
is_initialized=not self.skip_assignment_decref, is_initialized=not self.lhs_of_first_assignment,
pos=self.pos, code=code) pos=self.pos, code=code)
code.putln("%s = 0;" % rhstmp) code.putln("%s = 0;" % rhstmp)
code.funcstate.release_temp(rhstmp) code.funcstate.release_temp(rhstmp)
......
...@@ -152,12 +152,11 @@ class FinalOptimizePhase(Visitor.CythonTransform): ...@@ -152,12 +152,11 @@ class FinalOptimizePhase(Visitor.CythonTransform):
def visit_SingleAssignmentNode(self, node): def visit_SingleAssignmentNode(self, node):
if node.first: if node.first:
lhs = node.lhs lhs = node.lhs
lhs.lhs_of_first_assignment = True
if isinstance(lhs, ExprNodes.NameNode) and lhs.entry.type.is_pyobject: if isinstance(lhs, ExprNodes.NameNode) and lhs.entry.type.is_pyobject:
# Have variable initialized to 0 rather than None # Have variable initialized to 0 rather than None
lhs.entry.init_to_none = False lhs.entry.init_to_none = False
lhs.entry.init = 0 lhs.entry.init = 0
# Set a flag in NameNode to skip the decref
lhs.skip_assignment_decref = True
return node return node
def visit_SimpleCallNode(self, node): def visit_SimpleCallNode(self, node):
......
def f():
cdef int* p
if False:
p = [1, 2, 3]
_ERRORS = u"""
4:10: Literal list must be assigned to pointer at time of declaration
"""
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