From 08b91c0bbda3efe081021257a3808d56e2e42481 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 14 Oct 2003 20:46:27 +0000 Subject: [PATCH] PR c++/11878 * tree.c (build_target_expr_with_type): Call force_rvalue for classes with non-trivial copy ctors. PR c++/11063 * typeck.c (build_modify_expr): Call convert rather than abort. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72494 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/tree.c | 6 ++++++ gcc/cp/typeck.c | 5 +++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2cb9001..86d4364 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2003-10-14 Jason Merrill + + PR c++/11878 + * tree.c (build_target_expr_with_type): Call force_rvalue for + classes with non-trivial copy ctors. + + PR c++/11063 + * typeck.c (build_modify_expr): Call convert rather than abort. + 2003-10-14 Gabriel Dos Reis Breack out decl.c (3/n) diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index f99b316..8445d7e 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -310,6 +310,12 @@ build_target_expr_with_type (tree init, tree type) if (TREE_CODE (init) == TARGET_EXPR) return init; + else if (CLASS_TYPE_P (type) && !TYPE_HAS_TRIVIAL_INIT_REF (type) + && TREE_CODE (init) != COND_EXPR) + /* We need to build up a copy constructor call. COND_EXPR is a special + case because we already have copies on the arms and we don't want + another one here. */ + return force_rvalue (init); slot = build_decl (VAR_DECL, NULL_TREE, type); DECL_ARTIFICIAL (slot) = 1; diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 25d6ac4..a5301df 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4991,8 +4991,9 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs) { if (TREE_CODE (rhs) == CONSTRUCTOR) { - my_friendly_assert (same_type_p (TREE_TYPE (rhs), lhstype), - 20011220); + if (! same_type_p (TREE_TYPE (rhs), lhstype)) + /* Call convert to generate an error; see PR 11063. */ + rhs = convert (lhstype, rhs); result = build (INIT_EXPR, lhstype, lhs, rhs); TREE_SIDE_EFFECTS (result) = 1; return result; -- 2.7.4