https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119398
Bug ID: 119398 Summary: partial ordering of nested class template specializations fails with NTTP of nested class type Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: eric.niebler at gmail dot com Target Milestone: --- The following is valid C++20: template <class T> struct outer { struct value_type { T value{}; constexpr value_type() = default; constexpr value_type(T v) : value(v) {} }; template <auto, value_type...> struct inner; template <auto _> struct inner<_, value_type{}, value_type{}> {}; template <auto _, value_type I> struct inner<_, I, value_type{}> {}; template <auto _, value_type J> struct inner<_, value_type{}, J> {}; template <auto _, value_type I, value_type J> struct inner<_, I, J> {}; }; int main() { [[maybe_unused]] outer<int>::inner<0, 0, 1> i{}; } GCC rejects it with: <source>: In function 'int main()': <source>:28:30: error: ambiguous template instantiation for 'struct outer<int>::inner<0, outer<int>::value_type{0}, outer<int>::value_type{1}>' 28 | outer<int>::inner<0, 0, 1> i{}; | ^ It fails on trunk. I've also tested as far back as gcc-12, and it has never worked. https://godbolt.org/z/vfP5Y9hG9