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; }