https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107495
Bug ID: 107495 Summary: GCC does not consider the right contextual implicit conversions Product: gcc Version: 12.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: dangelog at gmail dot com Target Milestone: --- Testcase: struct Test { operator int *() const; operator void *() const; }; int main() { Test t; delete t; } GCC rejects this: <source>: In function 'int main()': <source>:32:12: error: ambiguous default type conversion from 'Test' 32 | delete t; | ^ <source>:32:12: note: candidate conversions include 'Test::operator void*() const' and 'Test::operator int*() const' <source>:32:12: error: type 'struct Test' argument given to 'delete', expected pointer But this is wrong. https://eel.is/c++draft/expr.delete#1.sentence-5 says "If of class type, the operand is contextually implicitly converted to a pointer to object type" and the attached note explicitly says "This implies that an object cannot be deleted using a pointer of type void* because void is not an object type". The definition of contextual conversion says https://eel.is/c++draft/conv#general-5 : "C is searched for non-explicit conversion functions whose return type is cv T or reference to cv T such that T is allowed by the context. There shall be exactly one such T." There is exactly one such T (conversion to pointer of object type), so GCC is rejecting valid code.