aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c22
2 files changed, 15 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 59a81c1..fc6ae49 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2003-08-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/11614
+ * decl.c (grokdeclarator): Recognize a flexible array based on the
+ type, not the form of the declarator.
+
2003-08-20 Jason Merrill <jason@redhat.com>
* semantics.c (simplify_aggr_init_expr): Split out from
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 1a4dcb2..e35fa07 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10593,21 +10593,9 @@ grokdeclarator (tree declarator,
case ARRAY_REF:
{
- register tree size;
-
- size = TREE_OPERAND (declarator, 1);
+ tree size = TREE_OPERAND (declarator, 1);
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;
@@ -11355,6 +11343,14 @@ grokdeclarator (tree declarator,
}
else if (decl_context == FIELD)
{
+ /* The C99 flexible array extension. */
+ if (!staticp && TREE_CODE (type) == ARRAY_TYPE
+ && TYPE_DOMAIN (type) == NULL_TREE)
+ {
+ tree itype = compute_array_index_type (dname, integer_zero_node);
+ type = build_cplus_array_type (TREE_TYPE (type), itype);
+ }
+
if (type == error_mark_node)
{
/* Happens when declaring arrays of sizes which