re PR c++/11878 (ICE in cp_expr_size)
authorJason Merrill <jason@redhat.com>
Tue, 14 Oct 2003 20:46:27 +0000 (16:46 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 14 Oct 2003 20:46:27 +0000 (16:46 -0400)
        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.

From-SVN: r72494

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/cp/typeck.c

index 2cb90015f109fda6cc03e3b534eb6659d2731899..86d4364ad0059b40ee92a4bd11c23efc3d90e21c 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 f99b3168da66404dcff4d33c753874756bc614cb..8445d7e13d4b3cb832ca366ffcb8734c1d5b578e 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 25d6ac4ef466a7d5487c1dee0276eddefa12061d..a5301df92879779c53caa281a7c014c47cbf124d 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;