From b8aaa1a3b97790dfaf45c2fdf671ed1ae81e3b07 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 31 Oct 2013 11:44:58 -0400 Subject: [PATCH] decl.c (cxx_maybe_build_cleanup): Always set LOOKUP_NONVIRTUAL. * decl.c (cxx_maybe_build_cleanup): Always set LOOKUP_NONVIRTUAL. * decl2.c (build_cleanup): Just call cxx_maybe_build_cleanup. From-SVN: r204265 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/decl.c | 8 +------- gcc/cp/decl2.c | 23 +++-------------------- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3410153..e061110 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2013-10-31 Jason Merrill + * decl.c (cxx_maybe_build_cleanup): Always set LOOKUP_NONVIRTUAL. + * decl2.c (build_cleanup): Just call cxx_maybe_build_cleanup. + PR c++/58162 * parser.c (cp_parser_late_parse_one_default_arg): Set TARGET_EXPR_DIRECT_INIT_P. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 476d559..09c1daa 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -14298,9 +14298,7 @@ cxx_maybe_build_cleanup (tree decl, tsubst_flags_t complain) type = TREE_TYPE (decl); if (type_build_dtor_call (type)) { - int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; - bool has_vbases = (TREE_CODE (type) == RECORD_TYPE - && CLASSTYPE_VBASECLASSES (type)); + int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR; tree addr; tree call; @@ -14309,10 +14307,6 @@ cxx_maybe_build_cleanup (tree decl, tsubst_flags_t complain) else addr = build_address (decl); - /* Optimize for space over speed here. */ - if (!has_vbases || flag_expensive_optimizations) - flags |= LOOKUP_NONVIRTUAL; - call = build_delete (TREE_TYPE (addr), addr, sfk_complete_destructor, flags, 0, complain); if (call == error_mark_node) diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index d776471..18e0e52 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2722,26 +2722,9 @@ import_export_decl (tree decl) tree build_cleanup (tree decl) { - tree temp; - tree type = TREE_TYPE (decl); - - /* This function should only be called for declarations that really - require cleanups. */ - gcc_assert (!TYPE_HAS_TRIVIAL_DESTRUCTOR (type)); - - /* Treat all objects with destructors as used; the destructor may do - something substantive. */ - mark_used (decl); - - if (TREE_CODE (type) == ARRAY_TYPE) - temp = decl; - else - temp = build_address (decl); - temp = build_delete (TREE_TYPE (temp), temp, - sfk_complete_destructor, - LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0, - tf_warning_or_error); - return temp; + tree clean = cxx_maybe_build_cleanup (decl, tf_warning_or_error); + gcc_assert (clean != NULL_TREE); + return clean; } /* Returns the initialization guard variable for the variable DECL, -- 2.7.4