diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-decl.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c90-flex-array-2.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c99-flex-array-6.c | 15 |
5 files changed, 55 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7ed966..fcbe406 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-02-06 Joseph Myers <joseph@codesourcery.com> + + PR c/36432 + * c-decl.c (grokdeclarator): Don't treat [] declarators in fields + as indicating flexible array members unless the field itself is + being declarared as the incomplete array. + 2009-02-06 Jan Hubicka <jh@suse.cz> PR tree-optimization/38844 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 35a9c4b..9fadad3 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -4389,6 +4389,7 @@ grokdeclarator (const struct c_declarator *declarator, } else if (decl_context == FIELD) { + bool flexible_array_member = false; if (array_parm_vla_unspec_p) /* Field names can in fact have function prototype scope so [*] is disallowed here through making @@ -4396,13 +4397,23 @@ grokdeclarator (const struct c_declarator *declarator, something other than a declaration with function prototype scope. */ size_varies = 1; - else if (pedantic && !flag_isoc99 && !in_system_header) + else + { + const struct c_declarator *t = declarator; + while (t->kind == cdk_attrs) + t = t->declarator; + flexible_array_member = (t->kind == cdk_id); + } + if (flexible_array_member + && pedantic && !flag_isoc99 && !in_system_header) pedwarn (input_location, OPT_pedantic, "ISO C90 does not support flexible array members"); /* ISO C99 Flexible array members are effectively identical to GCC's zero-length array extension. */ - itype = build_range_type (sizetype, size_zero_node, NULL_TREE); + if (flexible_array_member || array_parm_vla_unspec_p) + itype = build_range_type (sizetype, size_zero_node, + NULL_TREE); } else if (decl_context == PARM) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc1c009..f88b297 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-02-06 Joseph Myers <joseph@codesourcery.com> + + PR c/36432 + * gcc.dg/c90-flex-array-2.c, gcc.dg/c99-flex-array-6.c: New tests. + 2009-02-05 Jakub Jelinek <jakub@redhat.com> PR c++/39106 diff --git a/gcc/testsuite/gcc.dg/c90-flex-array-2.c b/gcc/testsuite/gcc.dg/c90-flex-array-2.c new file mode 100644 index 0000000..425ce84 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c90-flex-array-2.c @@ -0,0 +1,15 @@ +/* [] does not indicate a flexible array member unless it is the field + itself being declared as an incomplete array type rather than a + pointer or other type derived from such a type. PR 36432. */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */ + +void +f (void) +{ + int a[3]; + int (*p)[]; + struct { int (*p)[]; } s; + p = &a; + s.p = &a; +} diff --git a/gcc/testsuite/gcc.dg/c99-flex-array-6.c b/gcc/testsuite/gcc.dg/c99-flex-array-6.c new file mode 100644 index 0000000..468c4b3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-flex-array-6.c @@ -0,0 +1,15 @@ +/* [] does not indicate a flexible array member unless it is the field + itself being declared as an incomplete array type rather than a + pointer or other type derived from such a type. PR 36432. */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ + +void +f (void) +{ + int a[3]; + int (*p)[]; + struct { int (*p)[]; } s; + p = &a; + s.p = &a; +} |