public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/107495] New: GCC does not consider the right contextual implicit conversions @ 2022-11-01 14:23 dangelog at gmail dot com 2022-11-01 14:43 ` [Bug c++/107495] " dangelog at gmail dot com ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: dangelog at gmail dot com @ 2022-11-01 14:23 UTC (permalink / raw) To: gcc-bugs 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. ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/107495] GCC does not consider the right contextual implicit conversions 2022-11-01 14:23 [Bug c++/107495] New: GCC does not consider the right contextual implicit conversions dangelog at gmail dot com @ 2022-11-01 14:43 ` dangelog at gmail dot com 2022-11-01 17:54 ` mpolacek at gcc dot gnu.org 2022-12-09 19:42 ` pinskia at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: dangelog at gmail dot com @ 2022-11-01 14:43 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107495 --- Comment #1 from Giuseppe D'Angelo <dangelog at gmail dot com> --- Variation of the above: struct Test { template <class = void> operator int *() const; }; Test t; delete t; also fails: <source>: In function 'int main()': <source>:32:12: error: default type conversion cannot deduce template argument for 'template<class> Test::operator int*() const' 32 | delete t; | ^ <source>:32:12: error: type 'struct Test' argument given to 'delete', expected pointer But here I'm not 100% sure; is there is supposed to be any template argument deduction? Clang rejects this as well, while MSVC accepts it. ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/107495] GCC does not consider the right contextual implicit conversions 2022-11-01 14:23 [Bug c++/107495] New: GCC does not consider the right contextual implicit conversions dangelog at gmail dot com 2022-11-01 14:43 ` [Bug c++/107495] " dangelog at gmail dot com @ 2022-11-01 17:54 ` mpolacek at gcc dot gnu.org 2022-12-09 19:42 ` pinskia at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: mpolacek at gcc dot gnu.org @ 2022-11-01 17:54 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107495 Marek Polacek <mpolacek at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |mpolacek at gcc dot gnu.org --- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> --- I think here the problem is that delete_sanity uses 627 t = build_expr_type_conversion (WANT_POINTER, exp, true); but WANT_POINTER includes 'void*'. I suppose we'll need WANT_POINTER_TO_OBJECT, a subset of WANT_POINTER, and use it in delete_sanity. ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/107495] GCC does not consider the right contextual implicit conversions 2022-11-01 14:23 [Bug c++/107495] New: GCC does not consider the right contextual implicit conversions dangelog at gmail dot com 2022-11-01 14:43 ` [Bug c++/107495] " dangelog at gmail dot com 2022-11-01 17:54 ` mpolacek at gcc dot gnu.org @ 2022-12-09 19:42 ` pinskia at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-12-09 19:42 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107495 --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Giuseppe D'Angelo from comment #1) > Variation of the above: The testcase in comment #1 is almost definitely the same as PR 59328. Note the testcase in comment #0 is also rejected by clang ... ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-12-09 19:42 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-11-01 14:23 [Bug c++/107495] New: GCC does not consider the right contextual implicit conversions dangelog at gmail dot com 2022-11-01 14:43 ` [Bug c++/107495] " dangelog at gmail dot com 2022-11-01 17:54 ` mpolacek at gcc dot gnu.org 2022-12-09 19:42 ` pinskia at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).