diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-03-09 10:08:40 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-03-09 10:08:40 +0000 |
commit | 65196e37241baacee5ec6e4915d4b333fcfbb35b (patch) | |
tree | 3dfa650db0b5dd6499bcd5eb04a226890b87cac6 /gcc/cp | |
parent | fab459303ffbda687b43cc4e1e21f522e59c4e42 (diff) | |
download | gcc-65196e37241baacee5ec6e4915d4b333fcfbb35b.zip gcc-65196e37241baacee5ec6e4915d4b333fcfbb35b.tar.gz gcc-65196e37241baacee5ec6e4915d4b333fcfbb35b.tar.bz2 |
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
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2f684b4..608a23c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2004-03-09 Mark Mitchell <mark@codesourcery.com> + PR c++/14230 + * call.c (initialize_reference): Handle initializers that are + class-member access expressions applies to rvalues. + +2004-03-09 Mark Mitchell <mark@codesourcery.com> + PR c++/14432 * name-lookup.c (supplement_binding): Ignore functions that are marked DECL_ANTICIPATED. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index b8b7b7a..e371d30 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); |