re PR c/29129 ([DR#341] unnamed parameters using [*])
authorJoseph Myers <joseph@codesourcery.com>
Wed, 4 Feb 2009 00:59:21 +0000 (00:59 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Wed, 4 Feb 2009 00:59:21 +0000 (00:59 +0000)
PR c/29129
* c-decl.c (grokdeclarator): Mark [*] arrays in field declarators
as having variable size.  Do not give an error for unnamed
parameters with [*] declarators.  Give a warning for type names
with [*] declarators and mark them as variable size.
* c-parser.c (c_parser_sizeof_expression): Do not give an error
for sizeof applied to [*] type names.

testsuite:
* c90-arraydecl-1.c: Do not expect error for [*] in abstract
declarator.
* vla-6.c: Likewise.  Expect warning not error for [*] lexically
inside function prototype but not part of parameter declarator.
* vla-11.c: New test.

From-SVN: r143918

gcc/ChangeLog
gcc/c-decl.c
gcc/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c90-arraydecl-1.c
gcc/testsuite/gcc.dg/vla-11.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vla-6.c

index c7d7b01..fb586ed 100644 (file)
@@ -1,3 +1,13 @@
+2009-02-03  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/29129
+       * c-decl.c (grokdeclarator): Mark [*] arrays in field declarators
+       as having variable size.  Do not give an error for unnamed
+       parameters with [*] declarators.  Give a warning for type names
+       with [*] declarators and mark them as variable size.
+       * c-parser.c (c_parser_sizeof_expression): Do not give an error
+       for sizeof applied to [*] type names.
+
 2009-02-03  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR C++/36607
index 262d9d9..35a9c4b 100644 (file)
@@ -4389,7 +4389,14 @@ grokdeclarator (const struct c_declarator *declarator,
              }
            else if (decl_context == FIELD)
              {
-               if (pedantic && !flag_isoc99 && !in_system_header)
+               if (array_parm_vla_unspec_p)
+                 /* Field names can in fact have function prototype
+                    scope so [*] is disallowed here through making
+                    the field variably modified, not through being
+                    something other than a declaration with function
+                    prototype scope.  */
+                 size_varies = 1;
+               else if (pedantic && !flag_isoc99 && !in_system_header)
                  pedwarn (input_location, OPT_pedantic,
                           "ISO C90 does not support flexible array members");
 
@@ -4401,12 +4408,6 @@ grokdeclarator (const struct c_declarator *declarator,
              {
                if (array_parm_vla_unspec_p)
                  {
-                   if (! orig_name)
-                     {
-                       /* C99 6.7.5.2p4 */
-                       error ("%<[*]%> not allowed in other than a declaration");
-                     }
-
                    itype = build_range_type (sizetype, size_zero_node, NULL_TREE);
                    size_varies = 1;
                  }
@@ -4415,12 +4416,14 @@ grokdeclarator (const struct c_declarator *declarator,
              {
                if (array_parm_vla_unspec_p)
                  {
-                   /* The error is printed elsewhere.  We use this to
-                      avoid messing up with incomplete array types of
-                      the same type, that would otherwise be modified
-                      below.  */
+                   /* C99 6.7.5.2p4 */
+                   warning (0, "%<[*]%> not in a declaration");
+                   /* We use this to avoid messing up with incomplete
+                      array types of the same type, that would
+                      otherwise be modified below.  */
                    itype = build_range_type (sizetype, size_zero_node,
                                              NULL_TREE);
+                   size_varies = 1;
                  }
              }
 
index 8844769..199a5a7 100644 (file)
@@ -4949,13 +4949,6 @@ c_parser_sizeof_expression (c_parser *parser)
       /* sizeof ( type-name ).  */
       skip_evaluation--;
       in_sizeof--;
-      if (type_name->declarator->kind == cdk_array
-         && type_name->declarator->u.array.vla_unspec_p)
-       {
-         /* C99 6.7.5.2p4 */
-         error_at (expr_loc,
-                   "%<[*]%> not allowed in other than a declaration");
-       }
       return c_expr_sizeof_type (type_name);
     }
   else
index 67369d9..25dedae 100644 (file)
@@ -1,3 +1,12 @@
+2009-02-03  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/29129
+       * c90-arraydecl-1.c: Do not expect error for [*] in abstract
+       declarator.
+       * vla-6.c: Likewise.  Expect warning not error for [*] lexically
+       inside function prototype but not part of parameter declarator.
+       * vla-11.c: New test.
+
 2009-02-03  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/warn/main-4.C: New test.
index 97dc1ee..2b7eadb 100644 (file)
@@ -10,7 +10,7 @@
 
 void foo0 (int a, int b[*]); /* { dg-error "ISO C90" "\[*\] not in C90" } */
 void foo1 (int, int [*]); /* { dg-error "ISO C90" "\[*\] not in C90" } */
-/* { dg-error "allowed" "\'\[*\]\' not allowed in other than a declaration" { target *-*-* } 12 } */
+
 
 /* Use of static and type qualifiers (not allowed with abstract declarators)
    is a C99 feature.  */
diff --git a/gcc/testsuite/gcc.dg/vla-11.c b/gcc/testsuite/gcc.dg/vla-11.c
new file mode 100644 (file)
index 0000000..8948e6b
--- /dev/null
@@ -0,0 +1,13 @@
+/* Further tests of [*] being rejected other that in declarations, as
+   per the consensus in DR#341 that the second example there should be
+   invalid (but warnings because the final wording appears to allow
+   these cases).  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+void foo11a(int x[sizeof(int *(*)[*])]);       /* { dg-warning "not in a declaration" } */
+void foo11b(__SIZE_TYPE__ x, int y[(__SIZE_TYPE__)(int (*)[*])x]);     /* { dg-warning "not in a declaration" } */
+void foo11c(struct s { int (*x)[*]; } *y);     /* { dg-error "a member of a structure or union cannot have a variably modified type" "variably modified" } */
+/* { dg-warning "'struct s' declared inside parameter list" "struct decl" { target *-*-* } 11 } */
+/* { dg-warning "its scope is only this definition or declaration" "struct scope" { target *-*-* } 11 } */
index b7bdb31..a7f5f05 100644 (file)
@@ -7,9 +7,12 @@ int foo3(int i)[*];            /* { dg-error "not allowed in other than function prototype
 void foo4(int o[*][4]) { }     /* { dg-error "not allowed in other than function prototype scope" } */
 void foo5(int o[4][*]) { }     /* { dg-error "not allowed in other than function prototype scope" } */
 
-/* [*] can't be used in a type that's not a declaration */
-void foo11(int x[sizeof(int (*)[*])]); /* { dg-error "not allowed in other than a declaration" } */
-void foo12(int [*]);           /* { dg-error "not allowed in other than a declaration" } */
+/* [*] can't be used in a type that's not a declaration (maybe, the
+   final wording for DR#341 would allow it although the first
+   discussed intent would not).  */
+void foo11(int x[sizeof(int (*)[*])]); /* { dg-warning "not in a declaration" } */
+/* This case is allowed per DR#341.  */
+void foo12(int [*]);
 
 extern int n;
 int B[100];