https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104873
Bug ID: 104873 Summary: Bug in overload resolution for constrained class templates with deduction guides Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jgopel at gmail dot com Target Milestone: --- Given the following code: ```cpp template<typename T> concept C = true; template<C T> struct S { S(const S&) { ... } S(const T&) { ... } }; // NOTE: The class is constrained, the deduction guide is not template<typename T> S(S<T>) -> S<S<T>>; ``` LLVM selects `S(S)` and GCC selects `S(T)`. I believe LLVM is correct here because the built in deduction guide for `S(S)` is ```cpp template<C T> S(const S<T>&) -> S<T>; ``` which is more constrained. I don't believe there's a case where the code example as-written is intended. I would suggest emitting a warning and using the built in deduction guide. Godbolt: https://godbolt.org/z/T79f164nW LLVM issue suggesting a warning: https://github.com/llvm/llvm-project/issues/54310 Relevant wording: - https://eel.is/c++draft/over.match.class.deduct#1.3 - https://eel.is/c++draft/over.match.best#general-2.10