aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2007-02-20 07:28:35 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2007-02-20 07:28:35 +0000
commitc88b0c50f7b26078e9b4c6d7d7749f8de44b1f07 (patch)
tree5a8d0059488f9430e6d776fb79b0d30d44c2ef11
parent9e4bd0ea129df7075b44dcae322a7abe85b68ee5 (diff)
downloadgcc-c88b0c50f7b26078e9b4c6d7d7749f8de44b1f07.zip
gcc-c88b0c50f7b26078e9b4c6d7d7749f8de44b1f07.tar.gz
gcc-c88b0c50f7b26078e9b4c6d7d7749f8de44b1f07.tar.bz2
call.c (build_new_method_call): Ensure that explicit calls of destructors have type "void".
* call.c (build_new_method_call): Ensure that explicit calls of destructors have type "void". From-SVN: r122153
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c14
2 files changed, 19 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0c6b90d..c326393 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-19 Mark Mitchell <mark@codesourcery.com>
+
+ * call.c (build_new_method_call): Ensure that explicit calls of
+ destructors have type "void".
+
2007-02-19 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* typeck.c (build_binary_op): Replace -Wstring-literal-comparison
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index b1b5a8e..f60c592 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5528,6 +5528,20 @@ build_new_method_call (tree instance, tree fns, tree args,
&& TREE_SIDE_EFFECTS (instance_ptr))
call = build2 (COMPOUND_EXPR, TREE_TYPE (call),
instance_ptr, call);
+ else if (call != error_mark_node
+ && DECL_DESTRUCTOR_P (cand->fn)
+ && !VOID_TYPE_P (TREE_TYPE (call)))
+ /* An explicit call of the form "x->~X()" has type
+ "void". However, on platforms where destructors
+ return "this" (i.e., those where
+ targetm.cxx.cdtor_returns_this is true), such calls
+ will appear to have a return value of pointer type
+ to the low-level call machinery. We do not want to
+ change the low-level machinery, since we want to be
+ able to optimize "delete f()" on such platforms as
+ "operator delete(~X(f()))" (rather than generating
+ "t = f(), ~X(t), operator delete (t)"). */
+ call = build_nop (void_type_node, call);
}
}
}