summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/c-decl.c4
-rw-r--r--gcc/c-parser.c5
-rw-r--r--gcc/c-tree.h5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vla-10.c7
6 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index baa8adc2962..e4d586105e0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2006-09-08 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/28504
+ * c-tree.h (struct c_arg_info): Add pending_sizes.
+ * c-parser.c (c_parser_parms_declarator,
+ c_parser_parms_list_declarator): Initialize pending_sizes.
+ * c-decl.c (get_parm_info): Initialize pending_sizes.
+ (get_parm_info): Set pending_sizes.
+ (grokdeclarator): Call put_pending_sizes for parameters for
+ function definition only.
+
2006-09-07 Jason Merrill <jason@redhat.com>
PR middle-end/27724
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index cf89191ae2e..cbd356f9cef 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -4420,6 +4420,8 @@ grokdeclarator (const struct c_declarator *declarator,
inner layer of declarator. */
arg_info = declarator->u.arg_info;
arg_types = grokparms (arg_info, really_funcdef);
+ if (really_funcdef)
+ put_pending_sizes (arg_info->pending_sizes);
/* Type qualifiers before the return type of the function
qualify the return type, not the function type. */
@@ -4981,6 +4983,7 @@ get_parm_info (bool ellipsis)
arg_info->tags = 0;
arg_info->types = 0;
arg_info->others = 0;
+ arg_info->pending_sizes = 0;
arg_info->had_vla_unspec = current_scope->had_vla_unspec;
/* The bindings in this scope must not get put into a block.
@@ -5136,6 +5139,7 @@ get_parm_info (bool ellipsis)
arg_info->tags = tags;
arg_info->types = types;
arg_info->others = others;
+ arg_info->pending_sizes = get_pending_sizes ();
return arg_info;
}
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 9031e5b4d2f..85202539283 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -2537,6 +2537,7 @@ c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
ret->tags = 0;
ret->types = list;
ret->others = 0;
+ ret->pending_sizes = 0;
ret->had_vla_unspec = 0;
c_parser_consume_token (parser);
pop_scope ();
@@ -2579,6 +2580,7 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs)
ret->tags = 0;
ret->types = 0;
ret->others = 0;
+ ret->pending_sizes = 0;
ret->had_vla_unspec = 0;
c_parser_consume_token (parser);
return ret;
@@ -2589,6 +2591,7 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs)
ret->parms = 0;
ret->tags = 0;
ret->others = 0;
+ ret->pending_sizes = 0;
ret->had_vla_unspec = 0;
/* Suppress -Wold-style-definition for this case. */
ret->types = error_mark_node;
@@ -2640,6 +2643,7 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs)
ret->tags = 0;
ret->types = 0;
ret->others = 0;
+ ret->pending_sizes = 0;
ret->had_vla_unspec = 0;
return ret;
}
@@ -2666,6 +2670,7 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs)
ret->tags = 0;
ret->types = 0;
ret->others = 0;
+ ret->pending_sizes = 0;
ret->had_vla_unspec = 0;
return ret;
}
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 3503c793a23..79579b0547a 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -309,6 +309,11 @@ struct c_arg_info {
/* A list of non-parameter decls (notably enumeration constants)
defined with the parameters. */
tree others;
+ /* A list of VLA sizes from the parameters. In a function
+ definition, these are used to ensure that side-effects in sizes
+ of arrays converted to pointers (such as a parameter int i[n++])
+ take place; otherwise, they are ignored. */
+ tree pending_sizes;
/* True when these arguments had [*]. */
BOOL_BITFIELD had_vla_unspec : 1;
};
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eb350af5741..0ba42158ca3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-08 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/28504
+ * gcc.dg/vla-10.c: New test.
+
2006-09-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/28858
diff --git a/gcc/testsuite/gcc.dg/vla-10.c b/gcc/testsuite/gcc.dg/vla-10.c
new file mode 100644
index 00000000000..47dff47c55f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vla-10.c
@@ -0,0 +1,7 @@
+/* ICE with VLA in nested parameter declaration: should be treated
+ like [*] instead of the size being expanded. Bug 28504 from Volker
+ Reichelt <reichelt@gcc.gnu.org>. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void foo(void (*p)(int n, int x[n])) {}