PR c++/11878
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Oct 2003 20:46:27 +0000 (20:46 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Oct 2003 20:46:27 +0000 (20:46 +0000)
        * 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
gcc/cp/tree.c
gcc/cp/typeck.c

index 2cb9001..86d4364 100644 (file)
@@ -1,3 +1,12 @@
+2003-10-14  Jason Merrill  <jason@redhat.com>
+
+       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  <gdr@integrable-solutions.net>
 
        Breack out decl.c (3/n)
index f99b316..8445d7e 100644 (file)
@@ -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;
index 25d6ac4..a5301df 100644 (file)
@@ -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;