[C PATCH] Fix C ICE with K&R definitions (PR c/89211)
Jakub Jelinek
jakub@redhat.com
Tue Feb 5 22:41:00 GMT 2019
Hi!
The r253411 change to improve diagnostics added code to set DECL_ARGUMENTS
to the declarator->u.arg_info->parms. My understanding is that this was
meant for function prototypes, so that we can emit better diagnostics for
those. Unfortunately, start_decl doesn't always return a new decl, but
returns what pushdecl returned, which could be the new prototype, but could
be some earlier prototyped or defined function. The expansion etc. is very
unhappy if a function definition changes in the middle from having no
arguments into one with DECL_ARGUMENTs, especially if those arguments are
invalid. So, this patch limits that change to prototypes only, doesn't try
to modify a function definition.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2019-02-05 Jakub Jelinek <jakub@redhat.com>
PR c/89211
* c-parser.c (c_parser_declaration_or_fndef): Don't update
DECL_ARGUMENTS of d if it has been defined already. Use a single if
instead of 3 nested ifs.
* gcc.dg/pr89211.c: New test.
--- gcc/c/c-parser.c.jj 2019-01-09 19:55:01.071371422 +0100
+++ gcc/c/c-parser.c 2019-02-05 20:57:14.460652556 +0100
@@ -2154,10 +2154,12 @@ c_parser_declaration_or_fndef (c_parser
tree d = start_decl (declarator, specs, false,
chainon (postfix_attrs,
all_prefix_attrs));
- if (d && TREE_CODE (d) == FUNCTION_DECL)
- if (declarator->kind == cdk_function)
- if (DECL_ARGUMENTS (d) == NULL_TREE)
- DECL_ARGUMENTS (d) = declarator->u.arg_info->parms;
+ if (d
+ && TREE_CODE (d) == FUNCTION_DECL
+ && declarator->kind == cdk_function
+ && DECL_ARGUMENTS (d) == NULL_TREE
+ && DECL_INITIAL (d) == NULL_TREE)
+ DECL_ARGUMENTS (d) = declarator->u.arg_info->parms;
if (omp_declare_simd_clauses.exists ())
{
tree parms = NULL_TREE;
--- gcc/testsuite/gcc.dg/pr89211.c.jj 2019-02-05 20:59:45.113159822 +0100
+++ gcc/testsuite/gcc.dg/pr89211.c 2019-02-05 20:59:40.331238946 +0100
@@ -0,0 +1,8 @@
+/* PR c/89211 */
+/* { dg-do compile } */
+
+void foo ();
+void foo ()
+{
+ void foo (struct S); /* { dg-warning "declared inside parameter list" } */
+}
Jakub
More information about the Gcc-patches
mailing list