diff options
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/c-decl.c | 25 | ||||
-rw-r--r-- | gcc/c-parser.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c90-arraydecl-1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vla-11.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vla-6.c | 9 |
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]; |