From 817aed6fc35ad24f7a04f6a9ac6616d4a6915ff4 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 22 Jul 2003 16:49:48 +0000 Subject: [PATCH] re PR c++/11614 (Incorrect handling of pointers to arrays) cp: PR c++/11614 * decl.c (grokdeclarator): An array member is only a flexible array member if the field itself is the array. testsuite: * g++.dg/ext/flexary1.C: New test. From-SVN: r69673 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 16 ++++++++------ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/ext/flexary1.C | 33 +++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/flexary1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 79565c65bec..8f37c7e8723 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-07-22 Nathan Sidwell + + PR c++/11614 + * decl.c (grokdeclarator): An array member is only a flexible + array member if the field itself is the array. + 2003-07-22 Kriang Lerdsuwanakij PR c++/10793 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 9e90d9e9045..22137be5967 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10615,14 +10615,18 @@ grokdeclarator (tree declarator, register tree size; size = TREE_OPERAND (declarator, 1); - - /* VC++ spells a zero-sized array with []. */ - if (size == NULL_TREE && decl_context == FIELD && ! staticp - && ! RIDBIT_SETP (RID_TYPEDEF, specbits)) - size = integer_zero_node; - declarator = TREE_OPERAND (declarator, 0); + /* C99 spells a flexible array member []. */ + if (size == NULL_TREE && decl_context == FIELD && ! staticp + && ! RIDBIT_SETP (RID_TYPEDEF, specbits) + && !(declarator && + (TREE_CODE (declarator) == CALL_EXPR + || TREE_CODE (declarator) == INDIRECT_REF + || TREE_CODE (declarator) == ADDR_EXPR + || TREE_CODE (declarator) == ARRAY_REF))) + size = integer_zero_node; + type = create_array_type_for_decl (dname, type, size); ctype = NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eddfa73d3b4..085f25d4ec5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-07-22 Nathan Sidwell + + * g++.dg/ext/flexary1.C: New test. + 2003-07-22 Kriang Lerdsuwanakij PR c++/10793 diff --git a/gcc/testsuite/g++.dg/ext/flexary1.C b/gcc/testsuite/g++.dg/ext/flexary1.C new file mode 100644 index 00000000000..4033e339da0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary1.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 + +// PR c++ 11614 + +typedef int ary_t[]; + +struct test +{ + ary_t *b; + int (*a)[]; // this is not a flexible array member +}; + +void test(void) +{ + struct test s; + int (*a)[] = 0; + ary_t *b = 0; + + a = s.a; + a = s.b; + + s.a = a; + s.b = a; + + b = s.a; + b = s.b; + + s.a = b; + s.b = b; +}