Fixed buffer [] syntax yet another time
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Wed, 13 Aug 2008 19:18:12 +0000 (21:18 +0200)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Wed, 13 Aug 2008 19:18:12 +0000 (21:18 +0200)
Cython/Compiler/Parsing.py
tests/compile/arrayargs.pyx

index 2607060e1ef901f2e414b89afd421e4dd36ec5f1..d2863db343e73b6f988aca3d86104965ae8852c3 100644 (file)
@@ -1627,8 +1627,13 @@ def p_c_simple_base_type(s, self_flag, nonempty):
         longness = longness, is_self_arg = self_flag)
 
 
-    # Treat trailing [] on type as buffer access
-    if s.sy == '[':
+    # Treat trailing [] on type as buffer access if it appears in a context
+    # where declarator names are required (so that it cannot mean int[] or
+    # sizeof(int[SIZE]))...
+    #
+    # (This means that buffers cannot occur where there can be empty declarators,
+    # which is an ok restriction to make.)
+    if nonempty and s.sy == '[':
         return p_buffer_access(s, type_node)
     else:
         return type_node
@@ -1637,10 +1642,6 @@ def p_buffer_access(s, base_type_node):
     # s.sy == '['
     pos = s.position()
     s.next()
-    if s.sy == ']' or s.sy == 'INT':
-        # not buffer, could be [] on C type nameless array arguments
-        s.put_back('[', '[')
-        return base_type_node
     positional_args, keyword_args = (
         p_positional_and_keyword_args(s, (']',), (0,), ('dtype',))
     )
index 2a18093efa8913bd344a43f2b414c46ab0dc02c6..535e4319f062e1b08d9a38124525ce3c764db674 100644 (file)
@@ -1,3 +1,4 @@
+
 cdef extern from *:
 
     cdef void foo(int[])
@@ -17,3 +18,8 @@ cdef struct OtherStruct:
 
 a = sizeof(int[23][34])
 b = sizeof(OtherStruct[43])
+
+DEF COUNT = 4
+c = sizeof(int[COUNT])
+d = sizeof(OtherStruct[COUNT])
+