[cfe-dev] Why the argument of `delete' is converted to void* ?
John McCall
rjmccall at apple.com
Mon Jul 9 11:06:56 PDT 2012
On Jul 8, 2012, at 10:46 AM, Enea Zaffanella wrote:
> On 07/05/2012 11:53 PM, John McCall wrote:
>> On Jul 4, 2012, at 10:13 AM, Enea Zaffanella wrote:
>>> On 07/04/2012 05:07 PM, Jean-Daniel Dupas wrote:
>>>> Le 4 juil. 2012 à 15:57, Enea Zaffanella a écrit :
>>> [...]
>>>>> Sorry for the misunderstanding, but the original question was not
>>>>> really meant to be restricted to classes having a trivial destructor
>>>>> (if you add a non-trivial destructor to class S then "delete ps" will
>>>>> call it, whereas "operator delete(ps)" will not).
>>>>>
>>>>> To rephrase my question: since in the general case "delete ps" may
>>>>> also call the destructor, why is its argument (always) converted to void*?
>>>>>
>>>>> Cheers,
>>>>> Enea.
>>>>
>>>>
>>>> AFAIK, even with a non trivial destructor, the code always end up
>>>> calling the operator delete(void *) to free the memory.
>>>
>>> Yes, the argument of "operator delete" has to be converted to a void*.
>>>
>>> But this, afaict, is an inner implementation detail that should not be
>>> exposed in the AST (or it should be exposed elsewhere, e.g., in a method
>>> named getOperatorDeleteArg).
>>>
>>> The argument of the CXXDeleteExpr is *not* subject to such an implicit
>>> conversion; as a matter of fact, the implicit conversion (if made
>>> explicit by the user) would change the semantics of the delete
>>> expression by killing the call of the destructor.
>>
>> It's a bug in the AST; Sema is doing an implicit conversion to void* in order
>> to not have to implement custom logic for deleting values of record type, but
>> it should at least be dropping the extra ICE when it does so. IR-generation
>> has to awkwardly work around this.
>>
>> John.
>
> Can you please review the attached patch?
> (It passes all tests in clang.)
How odd. This was done intentionally?
Anyway, approved.
John.
More information about the cfe-dev
mailing list