From 65196e37241baacee5ec6e4915d4b333fcfbb35b Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 9 Mar 2004 10:08:40 +0000 Subject: [PATCH] re PR c++/14230 (ICE in cp_expr_size) PR c++/14230 * call.c (initialize_reference): Handle initializers that are class-member access expressions applies to rvalues. PR c++/14230 * g++.dg/init/ref11.C: New test. From-SVN: r79165 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 10 ++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/ref11.C | 13 +++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/init/ref11.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2f684b4c1fe..608a23ce763 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-03-09 Mark Mitchell + + PR c++/14230 + * call.c (initialize_reference): Handle initializers that are + class-member access expressions applies to rvalues. + 2004-03-09 Mark Mitchell PR c++/14432 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index b8b7b7ae11d..e371d305abe 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6463,6 +6463,16 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup) type = TREE_TYPE (expr); var = make_temporary_var_for_ref_to_temp (decl, type); layout_decl (var, 0); + /* If the rvalue is the result of a function call it will be + a TARGET_EXPR. If it is some other construct (such as a + member access expression where the underlying object is + itself the result of a function call), turn it into a + TARGET_EXPR here. It is important that EXPR be a + TARGET_EXPR below since otherwise the INIT_EXPR will + attempt to make a bitwise copy of EXPR to intialize + VAR. */ + if (TREE_CODE (init) != TARGET_EXPR) + expr = get_target_expr (expr); /* Create the INIT_EXPR that will initialize the temporary variable. */ init = build (INIT_EXPR, type, var, expr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e55c0e3ab4..624bf21def4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-03-09 Mark Mitchell + + PR c++/14230 + * g++.dg/init/ref11.C: New test. + 2004-03-09 Mark Mitchell PR c++/14432 diff --git a/gcc/testsuite/g++.dg/init/ref11.C b/gcc/testsuite/g++.dg/init/ref11.C new file mode 100644 index 00000000000..b283e3a69be --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref11.C @@ -0,0 +1,13 @@ +// PR c++/14230 + +struct A { + A (); + A (const A&); + A& operator= (const A&); +}; + +struct D { + A a; +}; + +const A& z = D().a; -- 2.30.2