From a07db9ebf509212eed315379e16ba69e7c6eb69e Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Wed, 14 Oct 2009 22:06:59 -0700 Subject: [PATCH] Fix bug #409 with temps and sequence unpacking. --- Cython/Compiler/ExprNodes.py | 2 +- Cython/Compiler/Parsing.py | 2 +- tests/run/temp_alloc_T409.pyx | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 tests/run/temp_alloc_T409.pyx diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 62e96974..b16c9e8d 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -412,7 +412,7 @@ class ExprNode(Node): def allocate_temp_result(self, code): if self.temp_code: - raise RuntimeError("Temp allocated multiple times") + raise RuntimeError("Temp allocated multiple times in %r: %r" % (self.__class__.__name__, self.pos)) type = self.type if not type.is_void: if type.is_pyobject: diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index 175a7e71..c42a419e 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -924,7 +924,7 @@ def flatten_parallel_assignments(input, output): # individual elements. This transformation is applied # recursively, so that nested structures get matched as well. rhs = input[-1] - if not rhs.is_sequence_constructor: + if not rhs.is_sequence_constructor or not sum(lhs.is_sequence_constructor for lhs in input[:-1]): output.append(input) return diff --git a/tests/run/temp_alloc_T409.pyx b/tests/run/temp_alloc_T409.pyx new file mode 100644 index 00000000..d7927230 --- /dev/null +++ b/tests/run/temp_alloc_T409.pyx @@ -0,0 +1,11 @@ +__doc__ = """ + >>> foo() + ([0, 0], [0, 0]) +""" + +# Extracted from sage/plot/plot3d/index_face_set.pyx:502 +# Turns out to be a bug in implementation of PEP 3132 (Extended Iterable Unpacking) + +def foo(): + a = b = [0,0] + return a, b -- 2.26.2