llvm-project/clang/test/SemaTemplate/partial-order.cpp
Matheus Izvekov 954ccee5d5
[clang] fix partial ordering of NTTP packs (#134461)
This fixes partial ordering of pack expansions of NTTPs, by procedding
with the check using the pattern of the NTTP through the rules of the
non-pack case.

This also unifies almost all of the different versions of
FinishTemplateArgumentDeduction (except the function template case).
This makes sure they all follow the rules consistently, instantiating
the parameters and comparing those with the argument.

Fixes #132562
2025-04-07 12:30:51 -03:00

50 lines
1.6 KiB
C++

// RUN: %clang_cc1 -std=c++26 %s -verify
namespace hana_enable_if_idiom {
template<bool> struct A {};
template<typename, typename = A<true>> struct B;
template<typename T, bool N> struct B<T, A<N>> {};
template<typename T> struct B<T, A<T::value>> {};
struct C {
static const bool value = true;
};
B<C> b;
}
namespace GH132562 {
struct I {
int v = 0;
};
namespace t1 {
template <I... X> struct A;
template <I... X>
requires ((X.v == 0) ||...)
struct A<X...>;
} // namespace t1
namespace t2 {
template <I... X> struct A; // expected-note {{template is declared here}}
template <int... X> struct A<X...>;
// expected-error@-1 {{is not more specialized than the primary template}}
// expected-note@-2 {{no viable conversion from 'int' to 'I'}}
template <int... X> struct B; // expected-note {{template is declared here}}
template <I... X> struct B<X...>;
// expected-error@-1 {{is not more specialized than the primary template}}
// expected-note@-2 {{value of type 'const I' is not implicitly convertible to 'int'}}
} // namespace t2
namespace t3 {
struct J {
int v = 0;
constexpr J(int v) : v(v) {}
};
template <J... X> struct A;
template <int... X> struct A<X...>;
template <int... X> struct B; // expected-note {{template is declared here}}
template <J... X> struct B<X...>;
// expected-error@-1 {{is not more specialized than the primary template}}
// expected-note@-2 {{value of type 'const J' is not implicitly convertible to 'int'}}
} // namespace t3
} // namespace GH132562