From 2d188530483c739165beb1f2e0c96d27fbae8421 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 9 Oct 2008 22:15:17 +0200 Subject: [PATCH] re PR tree-optimization/37568 (ICE returning a struct) PR c++/37568 * semantics.c (finalize_nrv_r): Clear DECL_INITIAL instead of setting it to error_mark_node. * testsuite/libmudflap.c++/pass66-frag.cxx: New test. From-SVN: r141010 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 8 +++----- libmudflap/ChangeLog | 5 +++++ .../testsuite/libmudflap.c++/pass66-frag.cxx | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 libmudflap/testsuite/libmudflap.c++/pass66-frag.cxx diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bb4b6b21bedc..6ad8a8a6ad5b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-10-09 Jakub Jelinek + + PR c++/37568 + * semantics.c (finalize_nrv_r): Clear DECL_INITIAL instead of + setting it to error_mark_node. + 2008-10-07 Steve Ellcey * decl.c (start_cleanup_fn): Declare as inline. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index b1bbb38dfa8e..040a9b10c35e 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3310,13 +3310,11 @@ finalize_nrv_r (tree* tp, int* walk_subtrees, void* data) tree init; if (DECL_INITIAL (dp->var) && DECL_INITIAL (dp->var) != error_mark_node) - { - init = build2 (INIT_EXPR, void_type_node, dp->result, - DECL_INITIAL (dp->var)); - DECL_INITIAL (dp->var) = error_mark_node; - } + init = build2 (INIT_EXPR, void_type_node, dp->result, + DECL_INITIAL (dp->var)); else init = build_empty_stmt (); + DECL_INITIAL (dp->var) = NULL_TREE; SET_EXPR_LOCUS (init, EXPR_LOCUS (*tp)); *tp = init; } diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog index b09f9440d5fb..9214759b304c 100644 --- a/libmudflap/ChangeLog +++ b/libmudflap/ChangeLog @@ -1,3 +1,8 @@ +2008-10-09 Jakub Jelinek + + PR c++/37568 + * testsuite/libmudflap.c++/pass66-frag.cxx: New test. + 2008-09-26 Peter O'Gorman Steve Ellcey diff --git a/libmudflap/testsuite/libmudflap.c++/pass66-frag.cxx b/libmudflap/testsuite/libmudflap.c++/pass66-frag.cxx new file mode 100644 index 000000000000..989c7ca6f1c0 --- /dev/null +++ b/libmudflap/testsuite/libmudflap.c++/pass66-frag.cxx @@ -0,0 +1,17 @@ +// PR c++/37568 +// { dg-do compile } +// { dg-options "-fmudflap -O" } + +struct A +{ + int i; +}; + +A +foo () +{ + A a = { 1 }; + return a; +} + +A a = foo (); -- 2.39.5