From 1de2c900e018849ddc8b3b4e682d05fb3b697fbe Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 6 Feb 2009 20:12:10 +0000 Subject: [PATCH] =?utf8?q?re=20PR=20c/36432=20(=E2=80=9Cincompatible=20poi?= =?utf8?q?nter=20type=E2=80=9D=20with=20pointer=20to=20array=20as=20a=20st?= =?utf8?q?ruct=20member)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. testsuite: * gcc.dg/c90-flex-array-2.c, gcc.dg/c99-flex-array-6.c: New tests. From-SVN: r143989 --- gcc/ChangeLog | 7 +++++++ gcc/c-decl.c | 15 +++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/c90-flex-array-2.c | 15 +++++++++++++++ gcc/testsuite/gcc.dg/c99-flex-array-6.c | 15 +++++++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/c90-flex-array-2.c create mode 100644 gcc/testsuite/gcc.dg/c99-flex-array-6.c 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 + + 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 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 + + PR c/36432 + * gcc.dg/c90-flex-array-2.c, gcc.dg/c99-flex-array-6.c: New tests. + 2009-02-05 Jakub Jelinek 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; +} -- 2.7.4