From ffc44ab6831b7834cc88993c3fec7e9563747184 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Sat, 5 Aug 2006 23:41:22 +0000 Subject: [PATCH] re PR c/28502 (ICE with invalid declaration after definition) PR c/28502 * c-decl.c (validate_proto_after_old_defn): Return false on invalid argument. * gcc.dg/proto-1.c: New test. From-SVN: r115957 --- gcc/ChangeLog | 4 ++++ gcc/c-decl.c | 10 ++++++++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/proto-1.c | 5 +++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/proto-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0cbdf6d928e..4ac1f1f949b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2006-08-05 Volker Reichelt + PR c/28502 + * c-decl.c (validate_proto_after_old_defn): Return false on invalid + argument. + PR c/27721 * c-typeck.c (build_modify_expr): Test earlier for non-lvalues. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b900e8a8d5d..9a0e747c713 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -1083,8 +1083,14 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype) for (;;) { - tree oldargtype = TYPE_MAIN_VARIANT (TREE_VALUE (oldargs)); - tree newargtype = TYPE_MAIN_VARIANT (TREE_VALUE (newargs)); + tree oldargtype = TREE_VALUE (oldargs); + tree newargtype = TREE_VALUE (newargs); + + if (oldargtype == error_mark_node || newargtype == error_mark_node) + return false; + + oldargtype = TYPE_MAIN_VARIANT (oldargtype); + newargtype = TYPE_MAIN_VARIANT (newargtype); if (END_OF_ARGLIST (oldargtype) && END_OF_ARGLIST (newargtype)) break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 89f1d4a6e31..0cdbbefb009 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2006-08-05 Volker Reichelt + PR c/28502 + * gcc.dg/proto-1.c: New test. + PR c/27721 * gcc.dg/lvalue-4.c: New test. diff --git a/gcc/testsuite/gcc.dg/proto-1.c b/gcc/testsuite/gcc.dg/proto-1.c new file mode 100644 index 00000000000..13c59a8a54b --- /dev/null +++ b/gcc/testsuite/gcc.dg/proto-1.c @@ -0,0 +1,5 @@ +/* PR c/28502 */ +/* { dg-do compile } */ + +void foo() {} /* { dg-error "previous" } */ +void foo(void[]); /* { dg-error "array of voids" } */ -- 2.30.2