Commit b6df7f92 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix empty multi-dimensional array declarations.

parent 796db041
...@@ -661,6 +661,17 @@ class CArgDeclNode(Node): ...@@ -661,6 +661,17 @@ class CArgDeclNode(Node):
base_type = self.base_type.analyse(env, could_be_name = could_be_name) 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: if hasattr(self.base_type, 'arg_name') and self.base_type.arg_name:
self.declarator.name = 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) return self.declarator.analyse(base_type, env, nonempty = nonempty)
else: else:
return self.name_declarator, self.type return self.name_declarator, self.type
...@@ -821,7 +832,7 @@ class TemplatedTypeNode(CBaseTypeNode): ...@@ -821,7 +832,7 @@ class TemplatedTypeNode(CBaseTypeNode):
else: else:
# Array # 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: if len(self.positional_args) > 1 or self.keyword_args.key_value_pairs:
error(self.pos, "invalid array declaration") error(self.pos, "invalid array declaration")
self.type = PyrexTypes.error_type self.type = PyrexTypes.error_type
...@@ -832,9 +843,10 @@ class TemplatedTypeNode(CBaseTypeNode): ...@@ -832,9 +843,10 @@ class TemplatedTypeNode(CBaseTypeNode):
dimension = None dimension = None
else: else:
dimension = self.positional_args[0] dimension = self.positional_args[0]
self.type = CArrayDeclaratorNode(self.pos, self.array_declarator = CArrayDeclaratorNode(self.pos,
base = empty_declarator, 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 return self.type
......
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