From a3c5267cab6b291e842de6626be76c3355e6b447 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Mon, 6 Mar 2006 02:01:29 +0000 Subject: [PATCH] re PR c++/15759 (ICE with function pointers) PR c++/15759 * tree.c (bot_manip): Don't call mark_used. * g++.dg/other/default4.C: New test. From-SVN: r111754 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/tree.c | 15 ++++---------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/default4.C | 29 +++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/default4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f0d1301b7c5..4c735d74c0b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-03-06 Volker Reichelt + + PR c++/15759 + * tree.c (bot_manip): Don't call mark_used. + 2006-03-02 Mike Stump * decl2.c (import_export_decl): Remove redundant call to diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 16e87ec2d63..d58b5b350dd 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1173,16 +1173,11 @@ bot_manip (tree* tp, int* walk_subtrees, void* data) tree u; if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR) - { - mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0)); - u = build_cplus_new - (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1))); - } + u = build_cplus_new + (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1))); else - { - u = build_target_expr_with_type - (break_out_target_exprs (TREE_OPERAND (t, 1)), TREE_TYPE (t)); - } + u = build_target_expr_with_type + (break_out_target_exprs (TREE_OPERAND (t, 1)), TREE_TYPE (t)); /* Map the old variable to the new one. */ splay_tree_insert (target_remap, @@ -1197,8 +1192,6 @@ bot_manip (tree* tp, int* walk_subtrees, void* data) *walk_subtrees = 0; return NULL_TREE; } - else if (TREE_CODE (t) == CALL_EXPR) - mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0)); /* Make a copy of this node. */ return copy_tree_r (tp, walk_subtrees, NULL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d38d9599825..3d5f444ceea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-03-06 Volker Reichelt + + PR c++/15759 + * g++.dg/other/default4.C: New test. + 2005-03-05 Erik Edelmann PR fortran/16136 diff --git a/gcc/testsuite/g++.dg/other/default4.C b/gcc/testsuite/g++.dg/other/default4.C new file mode 100644 index 00000000000..59948098402 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default4.C @@ -0,0 +1,29 @@ +// PR c++/15759 +// Origin: Lars Rune Nøstdal +// Testcase: Volker Reichelt + +// { dg-do run } + +extern "C" void abort(); + +int n = 0; + +int f() { return ++n; } + +int(&foo1)() = f; +int(*foo2)() = &f; +int(*foo3)() = f; + +int bar1(int i = foo1()) { return i; } +int bar2(int i = foo2()) { return i; } +int bar3(int i = foo3()) { return i; } +int bar4(int i = f()) { return i; } + +int main() +{ + if (bar1() != 1) abort(); + if (bar2() != 2) abort(); + if (bar3() != 3) abort(); + if (bar4() != 4) abort(); + return 0; +} -- 2.30.2