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

--- Comment #2 from Jiang An <de34 at live dot cn> ---
> The question becomes is that an oversight of P3144R2 or not and should a null 
> pointer
> constant be valid always since that was never undefined or even had a chance 
> of being
> undefined.

CWG2392 (https://cplusplus.github.io/CWG/issues/2392.html) might be related.

In order to keep deleting (constant) null pointer well-formed, we may need to
choose one of following strategies:

1. Make a delete-expression whose operand (after conversion, if any) is a
pointer to an incomplete class type potentially constant evaluated. So that we
can distinguish constant null pointer operand in unevaluated operands (e.g. in
decltype).

2. Always accept such a "bad" delete-expression in unevaluated operands.

Both options reject non-constant and constant but non-null operands.

It seems that GCC is behaving like option 1 (rejecting `decltype(delete
std::declval<Incomplete*>())` while accepting `delete
static_cast<Incomplete*>(nullptr)`).
However, it doesn't seem possible to make it conforming to accept
potentially-evaluated `delete reinterpret_cast<Incomplete*>(std::uintptr_t{})`,
because the operand is not a constant (sub)expression.

On the other hand, I tend to believe "the object being deleted has incomplete
class type" is equivalent to "the pointed to type of the operand is an
incomplete class type", but it's also not very clear whether such reading is
correct.

Reply via email to