diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d0e90519821411b6f362a120bd72cd97b4942b55..44375350950e0588bea72cf04bf97b77b3ce29bc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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,
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 8a199287764af68ec67ac647d2b40729404ea78a..e24d558c465cdfbc55828e069945061ac198094c 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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)
     {
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 4b6fdc81c865eca7133976bbf99231eb911bd45e..1b6ba8f40c05bb7c6dcf75dfc9153ed07f5490ed 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -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;
 }