re PR c++/11614 (Incorrect handling of pointers to arrays)
authorJason Merrill <jason@redhat.com>
Thu, 21 Aug 2003 05:24:02 +0000 (01:24 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 21 Aug 2003 05:24:02 +0000 (01:24 -0400)
        PR c++/11614
        * decl.c (grokdeclarator): Recognize a flexible array based on the
        type, not the form of the declarator.

From-SVN: r70636

gcc/cp/ChangeLog
gcc/cp/decl.c

index 59a81c13d8c1e26247983581a49d9ca511ac30fb..fc6ae49f5acaca83a813d143714f66af78653f12 100644 (file)
@@ -1,3 +1,9 @@
+2003-08-21  Jason Merrill  <jason@redhat.com>
+
+       PR c++/11614
+       * decl.c (grokdeclarator): Recognize a flexible array based on the
+       type, not the form of the declarator.
+
 2003-08-20  Jason Merrill  <jason@redhat.com>
 
        * semantics.c (simplify_aggr_init_expr): Split out from
index 1a4dcb2537f4246abf5d015e2b9268d14ce71b96..e35fa07ab6912de9da05282b76b5bfd36174ce7e 100644 (file)
@@ -10593,21 +10593,9 @@ grokdeclarator (tree declarator,
 
        case ARRAY_REF:
          {
-           register tree size;
-
-           size = TREE_OPERAND (declarator, 1);
+           tree size = TREE_OPERAND (declarator, 1);
            declarator = TREE_OPERAND (declarator, 0);
 
-           /* C99 spells a flexible array member [].  */
-           if (size == NULL_TREE && decl_context == FIELD && ! staticp
-               && ! RIDBIT_SETP (RID_TYPEDEF, specbits)
-               && !(declarator &&
-                   (TREE_CODE (declarator) == CALL_EXPR
-                     || TREE_CODE (declarator) == INDIRECT_REF
-                     || TREE_CODE (declarator) == ADDR_EXPR
-                     || TREE_CODE (declarator) == ARRAY_REF)))
-             size = integer_zero_node;
-
            type = create_array_type_for_decl (dname, type, size);
 
            ctype = NULL_TREE;
@@ -11355,6 +11343,14 @@ grokdeclarator (tree declarator,
       }
     else if (decl_context == FIELD)
       {
+       /* The C99 flexible array extension.  */
+       if (!staticp && TREE_CODE (type) == ARRAY_TYPE
+           && TYPE_DOMAIN (type) == NULL_TREE)
+         {
+           tree itype = compute_array_index_type (dname, integer_zero_node);
+           type = build_cplus_array_type (TREE_TYPE (type), itype);
+         }
+
        if (type == error_mark_node)
          {
            /* Happens when declaring arrays of sizes which