rjmccall added a comment.

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.


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