[Bug c++/79706] invalid delete[] expression doesn't cause substitution failure

ppalka at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue May 12 17:54:45 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79706

--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #1)
> Probably the same issue:
> 
> struct A {
>   void operator delete(void*) = delete;
>   void operator delete[](void*) = delete;
> };
> 
> using type1 = decltype(delete (A*)0);
> using type2 = decltype(delete[] (A*)0);
> 
> Neither of these invalid delete expressions gives an error.

Hmm, according to [expr.delete]/7.3 (https://eel.is/c++draft/expr.delete#7.3):

    If the value of the operand of the delete-expression is a
    null pointer value, it is unspecified whether a deallocation
    function will be called as described above.

So I suppose we're not wrong to accept the above delete expressions?

If we use a non-zero pointer constant instead, then we do give an error for
this testcase:

79706-2.C:6:35: error: use of deleted function ‘static void A::operator
delete(void*)’
    6 | using type1 = decltype(delete (A*)16);
      |                                   ^~
79706-2.C:2:8: note: declared here
    2 |   void operator delete(void*) = delete;
      |        ^~~~~~~~
79706-2.C:7:37: error: use of deleted function ‘static void A::operator delete
[](void*)’
    7 | using type2 = decltype(delete[] (A*)16);
      |                                     ^~
79706-2.C:3:8: note: declared here
    3 |   void operator delete[](void*) = delete;
      |        ^~~~~~~~


More information about the Gcc-bugs mailing list