diff options
author | Mark Mitchell <mark@codesourcery.com> | 2007-02-20 07:28:35 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2007-02-20 07:28:35 +0000 |
commit | c88b0c50f7b26078e9b4c6d7d7749f8de44b1f07 (patch) | |
tree | 5a8d0059488f9430e6d776fb79b0d30d44c2ef11 | |
parent | 9e4bd0ea129df7075b44dcae322a7abe85b68ee5 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/call.c | 14 |
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); } } } |