From bfaba7a9c354ab688a552596cbf37d1c21081c36 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Tue, 13 Jan 2004 20:10:07 +0000 Subject: [PATCH] re PR c++/12709 (ICE with __FUNCTION__ and function-try-block) 2004-01-13 Andrew Pinski PR c++/12709 * c-common.c (finish_fname_decls): Use the chain only if the tree is an expr_stmt. 2004-01-13 Andrew Pinski PR c++/12709 * g++.dg/parse/try-catch-1.C: New test. From-SVN: r75814 --- gcc/ChangeLog | 6 ++++++ gcc/c-common.c | 8 +++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/parse/try-catch-1.C | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/parse/try-catch-1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 408798a0714..aafb532d3ac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-01-13 Andrew Pinski + + PR c++/12709 + * c-common.c (finish_fname_decls): Use the chain only if the + tree is an expr_stmt. + 2004-01-13 Vladimir Makarov * rtl.def: Add comment about new option in automata_option. diff --git a/gcc/c-common.c b/gcc/c-common.c index e12a9c0fea8..644511318c7 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -1053,7 +1053,13 @@ finish_fname_decls (void) tree *p = &DECL_SAVED_TREE (current_function_decl); /* Skip the dummy EXPR_STMT and any EH_SPEC_BLOCK. */ while (TREE_CODE (*p) != COMPOUND_STMT) - p = &TREE_CHAIN (*p); + { + if (TREE_CODE (*p) == EXPR_STMT) + p = &TREE_CHAIN (*p); + else + p = &TREE_OPERAND(*p, 0); + } + p = &COMPOUND_BODY (*p); if (TREE_CODE (*p) == SCOPE_STMT) p = &TREE_CHAIN (*p); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 426e8cac441..7a73238f8b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-01-13 Andrew Pinski + + PR c++/12709 + * g++.dg/parse/try-catch-1.C: New test. + 2004-01-13 Arnaud Charlet * ada/acats/run_all.sh: Add more verbose output in acats.log diff --git a/gcc/testsuite/g++.dg/parse/try-catch-1.C b/gcc/testsuite/g++.dg/parse/try-catch-1.C new file mode 100644 index 00000000000..e4ed1ad8e9f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/try-catch-1.C @@ -0,0 +1,14 @@ +// Test case from: +// Reduced by +// The problem was that g++ was ICE because +// it was deferring an NULL pointer because +// it should have been taking the operand 1 +// instead of the chain in finish_fname_decls. + + +void fun() +try +{ + __FUNCTION__; +} +catch (...) {}