OSDN Git Service

PR c/28504
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Sep 2006 23:41:21 +0000 (23:41 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Sep 2006 23:41:21 +0000 (23:41 +0000)
* 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.

testsuite:
* gcc.dg/vla-10.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116789 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-decl.c
gcc/c-parser.c
gcc/c-tree.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vla-10.c [new file with mode: 0644]

index baa8adc..e4d5861 100644 (file)
@@ -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
index cf89191..cbd356f 100644 (file)
@@ -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;
 }
 \f
index 9031e5b..8520253 100644 (file)
@@ -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;
                }
index 3503c79..79579b0 100644 (file)
@@ -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;
 };
index eb350af..0ba4215 100644 (file)
@@ -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 (file)
index 0000000..47dff47
--- /dev/null
@@ -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])) {}