aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/c-decl.c25
-rw-r--r--gcc/c-parser.c7
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.dg/c90-arraydecl-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/vla-11.c13
-rw-r--r--gcc/testsuite/gcc.dg/vla-6.c9
7 files changed, 53 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c7d7b01..fb586ed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 262d9d9..35a9c4b 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -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;
}
}
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 8844769..199a5a7 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 67369d9..25dedae 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/c90-arraydecl-1.c b/gcc/testsuite/gcc.dg/c90-arraydecl-1.c
index 97dc1ee..2b7eadb 100644
--- a/gcc/testsuite/gcc.dg/c90-arraydecl-1.c
+++ b/gcc/testsuite/gcc.dg/c90-arraydecl-1.c
@@ -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
index 0000000..8948e6b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vla-11.c
@@ -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 } */
diff --git a/gcc/testsuite/gcc.dg/vla-6.c b/gcc/testsuite/gcc.dg/vla-6.c
index b7bdb31..a7f5f05 100644
--- a/gcc/testsuite/gcc.dg/vla-6.c
+++ b/gcc/testsuite/gcc.dg/vla-6.c
@@ -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];