From 49b7aacb4ded4d0ab194713ccb24d4cd18a826a9 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 21 May 2003 19:27:50 -0400 Subject: [PATCH] init.c (build_vec_delete): Copy the address into a temporary variable before calling build_vec_delete_1. * 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 | 6 ++++++ gcc/cp/decl2.c | 3 +-- gcc/cp/init.c | 20 +++++++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d0e90519821..44375350950 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-05-21 Jason Merrill + + * 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 * pt.c (register_specialization): Update the decl's location, diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 8a199287764..e24d558c465 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 4b6fdc81c86..1b6ba8f40c0 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; } -- 2.30.2