aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2004-01-13 20:10:07 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2004-01-13 12:10:07 -0800
commitbfaba7a9c354ab688a552596cbf37d1c21081c36 (patch)
tree3d2acf96009bba59ab9e8c7bfadf7699055059b1
parent81c740ba1bfd1332d22b8f597da1522467ef6479 (diff)
downloadgcc-bfaba7a9c354ab688a552596cbf37d1c21081c36.zip
gcc-bfaba7a9c354ab688a552596cbf37d1c21081c36.tar.gz
gcc-bfaba7a9c354ab688a552596cbf37d1c21081c36.tar.bz2
re PR c++/12709 (ICE with __FUNCTION__ and function-try-block)
2004-01-13 Andrew Pinski <pinskia@physics.uc.edu> 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 <pinskia@physics.uc.edu> PR c++/12709 * g++.dg/parse/try-catch-1.C: New test. From-SVN: r75814
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-common.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/try-catch-1.C14
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 408798a..aafb532 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-01-13 Andrew Pinski <pinskia@physics.uc.edu>
+
+ 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 <vmakarov@redhat.com>
* rtl.def: Add comment about new option in automata_option.
diff --git a/gcc/c-common.c b/gcc/c-common.c
index e12a9c0..6445113 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 426e8ca..7a73238 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-01-13 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR c++/12709
+ * g++.dg/parse/try-catch-1.C: New test.
+
2004-01-13 Arnaud Charlet <charlet@act-europe.fr>
* 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 0000000..e4ed1ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/try-catch-1.C
@@ -0,0 +1,14 @@
+// Test case from: <ncm-nospam@cantrip.org>
+// Reduced by <bangerth@dealii.org>
+// 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 (...) {}