call.c (build_over_call): Don't create a save_expr of an aggregate, but rather its...
authorRichard Henderson <rth@redhat.com>
Mon, 5 Jan 2004 05:37:06 +0000 (21:37 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 5 Jan 2004 05:37:06 +0000 (21:37 -0800)
        * call.c (build_over_call): Don't create a save_expr of an
        aggregate, but rather its address.

From-SVN: r75414

gcc/cp/ChangeLog
gcc/cp/call.c

index aac96ee5af44f3769e7a0a0a2d0afdb8a4593a0a..7ca4f9c8b7463b3251b9a099982bf701723e5e20 100644 (file)
@@ -1,3 +1,8 @@
+2004-01-04  Richard Henderson  <rth@redhat.com>
+
+       * call.c (build_over_call): Don't create a save_expr of an
+       aggregate, but rather its address.
+
 2004-01-04  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/13529
index 46ebca522539c51bc8e10fa0dff4177dd603e1fc..26ca4885f7dbfdae60826a30434a26dd8a5a7c59 100644 (file)
@@ -4667,18 +4667,24 @@ build_over_call (struct z_candidate *cand, int flags)
        {
          /* We must only copy the non-tail padding parts. Use
             CLASSTYPE_AS_BASE for the bitwise copy.  */
-         tree to_as_base, arg_as_base, base_ptr_type;
+         tree to_ptr, arg_ptr, to_as_base, arg_as_base, base_ptr_type;
+         tree save_to;
+
+         to_ptr = save_expr (build_unary_op (ADDR_EXPR, to, 0));
+         arg_ptr = build_unary_op (ADDR_EXPR, arg, 0);
 
-         to = save_expr (to);
          base_ptr_type = build_pointer_type (as_base);
-         to_as_base = build_indirect_ref
-           (build_nop (base_ptr_type, build_unary_op (ADDR_EXPR, to, 0)), 0);
-         arg_as_base = build_indirect_ref
-           (build_nop (base_ptr_type, build_unary_op (ADDR_EXPR, arg, 0)), 0);
-         
+         to_as_base = build_nop (base_ptr_type, to_ptr);
+         to_as_base = build_indirect_ref (to_as_base, 0);
+         arg_as_base = build_nop (base_ptr_type, arg_ptr);
+         arg_as_base = build_indirect_ref (arg_as_base, 0);
+
+         save_to = build_indirect_ref (to_ptr, 0);
+
          val = build (MODIFY_EXPR, as_base, to_as_base, arg_as_base);
-         val = build (COMPOUND_EXPR, type, convert_to_void (val, NULL), to);
-         TREE_USED (val) = 1;
+         val = convert_to_void (val, NULL);
+         val = build (COMPOUND_EXPR, type, val, save_to);
+         TREE_NO_UNUSED_WARNING (val) = 1;
        }
       
       return val;