diff options
author | Jason Merrill <jason@redhat.com> | 2010-10-26 11:02:54 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-10-26 11:02:54 -0400 |
commit | 883fff6cf718997c2892be3f4b5177459b04c00f (patch) | |
tree | f3fb94088828b65bdc028441b244282b784c67fa /gcc | |
parent | 2dfa30b4c89ba3533ba68b3a9767b062716dc879 (diff) | |
download | gcc-883fff6cf718997c2892be3f4b5177459b04c00f.zip gcc-883fff6cf718997c2892be3f4b5177459b04c00f.tar.gz gcc-883fff6cf718997c2892be3f4b5177459b04c00f.tar.bz2 |
* tree.c (stabilize_expr): Handle xvalues properly.
From-SVN: r165969
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/cp/tree.c | 9 |
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 749582b..e4e6446 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,7 @@ 2010-10-26 Jason Merrill <jason@redhat.com> + * tree.c (stabilize_expr): Handle xvalues properly. + * call.c (build_over_call): Use argarray[0] for 'this' argument. * decl.c (finish_function): Don't look at function_depth. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index b8f76b0..18ed554 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -3018,18 +3018,23 @@ stabilize_expr (tree exp, tree* initp) if (!TREE_SIDE_EFFECTS (exp)) init_expr = NULL_TREE; - else if (!real_lvalue_p (exp) - || !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (exp))) + /* There are no expressions with REFERENCE_TYPE, but there can be call + arguments with such a type; just treat it as a pointer. */ + else if (TREE_CODE (TREE_TYPE (exp)) == REFERENCE_TYPE + || !lvalue_or_rvalue_with_address_p (exp)) { init_expr = get_target_expr (exp); exp = TARGET_EXPR_SLOT (init_expr); } else { + bool xval = !real_lvalue_p (exp); exp = cp_build_addr_expr (exp, tf_warning_or_error); init_expr = get_target_expr (exp); exp = TARGET_EXPR_SLOT (init_expr); exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error); + if (xval) + exp = move (exp); } *initp = init_expr; |