From c58e98c83bb5319ac03730825ad9c68d46d4263f Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Sat, 6 Nov 2010 21:58:50 +0000 Subject: [PATCH] re PR c/43384 (ICE: Segmentation fault with invalid K&R-like code) gcc/ 2010-11-16 Simon Martin PR c/43384 * c-decl.c (lookup_label): Labels can only be referenced in a function's scope. (store_parm_decls_oldstyle): Skip erroneous parameters. gcc/testsuite/ 2010-11-16 Simon Martin PR c/43384 * gcc.dg/parser-error-3.c: New test. From-SVN: r166408 --- gcc/ChangeLog | 7 +++++++ gcc/c-decl.c | 5 ++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/parse-error-3.c | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/parse-error-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c214862ce1c..cb4c17a7ee8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-06 Simon Martin + + PR c/43384 + * c-decl.c (lookup_label): Labels can only be referenced in a + function's scope. + (store_parm_decls_oldstyle): Skip erroneous parameters. + 2010-11-06 Anatoly Sokolov * config/fr30/fr30.h (FUNCTION_VALUE_REGNO_P, FUNCTION_VALUE, diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 7d27dfe8f0f..e1f14029b80 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3013,7 +3013,7 @@ lookup_label (tree name) tree label; struct c_label_vars *label_vars; - if (current_function_decl == 0) + if (current_function_scope == 0) { error ("label %qE referenced outside of any function", name); return 0; @@ -7847,6 +7847,9 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info) if (b && B_IN_CURRENT_SCOPE (b)) { decl = b->decl; + /* Skip erroneous parameters. */ + if (decl == error_mark_node) + continue; /* If we got something other than a PARM_DECL it is an error. */ if (TREE_CODE (decl) != PARM_DECL) error_at (DECL_SOURCE_LOCATION (decl), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 911ba143162..98a866bb2c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-06 Simon Martin + + PR c/43384 + * gcc.dg/parser-error-3.c: New test. + 2010-11-06 Nathan Froyd PR c++/45332 diff --git a/gcc/testsuite/gcc.dg/parse-error-3.c b/gcc/testsuite/gcc.dg/parse-error-3.c new file mode 100644 index 00000000000..1a463b5dd6b --- /dev/null +++ b/gcc/testsuite/gcc.dg/parse-error-3.c @@ -0,0 +1,14 @@ +/* PR c/43384 */ +/* { dg-do "compile" } */ + +void c_direct(par) + void *par = &&lab; /* { dg-error "is initialized|non-standard|outside of" } */ +{} + +void foo(p, q) + int *p = &q; /* { dg-error "initialized|undeclared" } */ +{} + +void bar(i) + int j = i; /* { dg-error "initialized|undeclared|no such parameter" } */ +{}