init.c (build_vec_delete): Copy the address into a temporary variable before calling...
authorJason Merrill <jason@redhat.com>
Wed, 21 May 2003 23:27:50 +0000 (19:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 21 May 2003 23:27:50 +0000 (19:27 -0400)
        * init.c (build_vec_delete): Copy the address into a temporary
        variable before calling build_vec_delete_1.
        * decl2.c (delete_sanity): Don't call stabilize_reference.

From-SVN: r67072

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/init.c

index d0e90519821411b6f362a120bd72cd97b4942b55..44375350950e0588bea72cf04bf97b77b3ce29bc 100644 (file)
@@ -1,3 +1,9 @@
+2003-05-21  Jason Merrill  <jason@redhat.com>
+
+       * init.c (build_vec_delete): Copy the address into a temporary
+       variable before calling build_vec_delete_1.
+       * decl2.c (delete_sanity): Don't call stabilize_reference.
+
 2003-05-21  Nathan Sidwell  <nathan@codesourcery.com>
 
        * pt.c (register_specialization): Update the decl's location,
index 8a199287764af68ec67ac647d2b40729404ea78a..e24d558c465cdfbc55828e069945061ac198094c 100644 (file)
@@ -490,8 +490,7 @@ delete_sanity (tree exp, tree size, int doing_vec, int use_global_delete)
   if (TREE_CODE (exp) == OFFSET_REF)
     exp = resolve_offset_ref (exp);
   exp = convert_from_reference (exp);
-  t = stabilize_reference (exp);
-  t = build_expr_type_conversion (WANT_POINTER, t, true);
+  t = build_expr_type_conversion (WANT_POINTER, exp, true);
 
   if (t == NULL_TREE || t == error_mark_node)
     {
index 4b6fdc81c865eca7133976bbf99231eb911bd45e..1b6ba8f40c05bb7c6dcf75dfc9153ed07f5490ed 100644 (file)
@@ -3359,21 +3359,24 @@ build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
      int use_global_delete;
 {
   tree type;
+  tree rval;
+  tree base_init = NULL_TREE;
 
   if (TREE_CODE (base) == OFFSET_REF)
     base = resolve_offset_ref (base);
 
   type = TREE_TYPE (base);
 
-  base = stabilize_reference (base);
-
   if (TREE_CODE (type) == POINTER_TYPE)
     {
       /* Step back one from start of vector, and read dimension.  */
       tree cookie_addr;
 
       if (TREE_SIDE_EFFECTS (base))
-       base = save_expr (base);
+       {
+         base_init = get_target_expr (base);
+         base = TARGET_EXPR_SLOT (base_init);
+       }
       type = strip_array_types (TREE_TYPE (type));
       cookie_addr = build (MINUS_EXPR,
                           build_pointer_type (sizetype),
@@ -3388,7 +3391,10 @@ build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
       type = strip_array_types (type);
       base = build_unary_op (ADDR_EXPR, base, 1);
       if (TREE_SIDE_EFFECTS (base))
-       base = save_expr (base);
+       {
+         base_init = get_target_expr (base);
+         base = TARGET_EXPR_SLOT (base_init);
+       }
     }
   else
     {
@@ -3397,6 +3403,10 @@ build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
       return error_mark_node;
     }
 
-  return build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
+  rval = build_vec_delete_1 (base, maxindex, type, auto_delete_vec,
                             use_global_delete);
+  if (base_init)
+    rval = build (COMPOUND_EXPR, TREE_TYPE (rval), base_init, rval);
+
+  return rval;
 }