shiva0217 added a comment.

In D79378#4103366 <https://reviews.llvm.org/D79378#4103366>, @rjmccall wrote:

> In D79378#4101935 <https://reviews.llvm.org/D79378#4101935>, @shiva0217 wrote:
>
>> In D79378#4101829 <https://reviews.llvm.org/D79378#4101829>, @rjmccall wrote:
>>
>>> In D79378#4101613 <https://reviews.llvm.org/D79378#4101613>, @shiva0217 
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> I have a question for the delete function call sinking in -Oz.
>>>>
>>>> https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf.
>>>> According to 3.7.4.2/3
>>>> ` The value of the first argument supplied to a deallocation function may 
>>>> be a null pointer value; if so, and if the deallocation function is one 
>>>> supplied in the standard library, the call has no effect. Otherwise, the 
>>>> behavior is undefined`
>>>>
>>>> It seems the null checking can be skipped only when the delete is not from 
>>>> the standard library(have been overloaded by the user), isn't it?
>>>
>>> The paragraph you just quoted says that the deallocation functions provided 
>>> by the standard library are required have no effect on null pointers.  That 
>>> means it's fine to call them with a null pointer even if the source 
>>> wouldn't normally execute that call.  We could just insert these calls into 
>>> random other code if we wanted to.
>>
>> Is a null operand of delete in the source code no effect because there will 
>> be null pointer checking generated?  Or the delete(null) in assembly code 
>> also valid?
>
> In [expr.delete], the standard specifies that using the `delete` operator on 
> a null pointer is required to have no effect.  It does not specify how that 
> should be implemented.  In [basic.std.dynamic.deallocation], the standard 
> also specifies that the library-provided `operator delete` functions must 
> have no effect when given a null pointer.  This requirement applies no matter 
> how the function is called, so yes, a call from assembly that passed a null 
> pointer would also be required to have no effect.  More officially, you can 
> simply take the address of `operator delete`, yielding an rvalue of `void 
> (*)(void *)` (or similar, depending on which `operator delete` you use), 
> which can then be called later in a context that doesn't understand it's 
> calling a deallocation function; such a call is still required to have no 
> effect when passing a null pointer, because the requirement is laid on the 
> function, separate from the circumstances of it being called as part of the 
> `delete` operator.
>
> Note also that calling `operator delete` unconditionally when implementing 
> the `delete` operator is explicitly blessed by [expr.delete]p7:
>
>> If the value of the operand of the delete-expression is not a null pointer 
>> value, then:
>>
>>   ...
>>
>> Otherwise, it is unspecified whether the deallocation function will be 
>> called.

Hi @rjmccall,

That make sense to me.
Thanks for sharing your insight of C++ standard and taking time to answer the 
questions. 
Thank you ^^


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79378/new/

https://reviews.llvm.org/D79378

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to