aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-10-31 11:44:58 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-10-31 11:44:58 -0400
commitb8aaa1a3b97790dfaf45c2fdf671ed1ae81e3b07 (patch)
treeb7c74e14c0dcd2d71253f0e3e742eb1aa28fc881 /gcc/cp
parent1c79ebd52214a424949c5a242ee440f211bc9566 (diff)
downloadgcc-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/ChangeLog3
-rw-r--r--gcc/cp/decl.c8
-rw-r--r--gcc/cp/decl2.c23
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,