From b6df7f927a65527ec33bf7548c6fa531864e7b1a Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Thu, 18 Feb 2010 17:49:10 -0800 Subject: [PATCH] Fix empty multi-dimensional array declarations. --- Cython/Compiler/Nodes.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index fd4460cb..4302b999 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -661,6 +661,17 @@ class CArgDeclNode(Node): base_type = self.base_type.analyse(env, could_be_name = could_be_name) if hasattr(self.base_type, 'arg_name') and self.base_type.arg_name: self.declarator.name = self.base_type.arg_name + # The parser is unable to resolve the ambiguity of [] as part of the + # type (e.g. in buffers) or empty declarator (as with arrays). + # This is only arises for empty multi-dimensional arrays. + if (base_type.is_array + and isinstance(self.base_type, TemplatedTypeNode) + and isinstance(self.declarator, CArrayDeclaratorNode)): + declarator = self.declarator + while isinstance(declarator.base, CArrayDeclaratorNode): + declarator = declarator.base + declarator.base = self.base_type.array_declarator + base_type = base_type.base_type return self.declarator.analyse(base_type, env, nonempty = nonempty) else: return self.name_declarator, self.type @@ -821,7 +832,7 @@ class TemplatedTypeNode(CBaseTypeNode): else: # Array - empty_declarator = CNameDeclaratorNode(self.pos, name="") + empty_declarator = CNameDeclaratorNode(self.pos, name="", cname=None) if len(self.positional_args) > 1 or self.keyword_args.key_value_pairs: error(self.pos, "invalid array declaration") self.type = PyrexTypes.error_type @@ -832,9 +843,10 @@ class TemplatedTypeNode(CBaseTypeNode): dimension = None else: dimension = self.positional_args[0] - self.type = CArrayDeclaratorNode(self.pos, + self.array_declarator = CArrayDeclaratorNode(self.pos, base = empty_declarator, - dimension = dimension).analyse(base_type, env)[1] + dimension = dimension) + self.type = self.array_declarator.analyse(base_type, env)[1] return self.type -- 2.26.2