diff options
author | Jason Merrill <jason@redhat.com> | 2013-10-31 11:44:58 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-10-31 11:44:58 -0400 |
commit | b8aaa1a3b97790dfaf45c2fdf671ed1ae81e3b07 (patch) | |
tree | b7c74e14c0dcd2d71253f0e3e742eb1aa28fc881 /gcc/cp | |
parent | 1c79ebd52214a424949c5a242ee440f211bc9566 (diff) | |
download | gcc-b8aaa1a3b97790dfaf45c2fdf671ed1ae81e3b07.zip gcc-b8aaa1a3b97790dfaf45c2fdf671ed1ae81e3b07.tar.gz gcc-b8aaa1a3b97790dfaf45c2fdf671ed1ae81e3b07.tar.bz2 |
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
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 8 | ||||
-rw-r--r-- | 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 <jason@redhat.com> + * 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..09c1daaa 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, |