From: Mark Mitchell Date: Tue, 20 Feb 2007 07:28:35 +0000 (+0000) Subject: call.c (build_new_method_call): Ensure that explicit calls of destructors have type... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c88b0c50f7b26078e9b4c6d7d7749f8de44b1f07;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0c6b90d7edd..c3263933a46 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2007-02-19 Mark Mitchell + + * call.c (build_new_method_call): Ensure that explicit calls of + destructors have type "void". + 2007-02-19 Manuel Lopez-Ibanez * typeck.c (build_binary_op): Replace -Wstring-literal-comparison diff --git a/gcc/cp/call.c b/gcc/cp/call.c index b1b5a8e8277..f60c59260fd 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); } } }