mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
ba1f3db4b0
We previously would not correctly for the initial parameter mapping for variadic template parameters in Concepts. Testing this lead to the discovery that with the normalization process we would need to substitute into already-substituted-into template arguments, which means we need to add NonTypeTemplateParmExpr support to TemplateInstantiator. We do that by substituting into the replacement and the type separately, and then re-checking the expression against the NTTP with the new type, in order to form any new required implicit casts (for cases where the type of the NTTP was dependent).
28 lines
817 B
C++
28 lines
817 B
C++
// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify
|
|
|
|
template<auto T, decltype(T) U>
|
|
concept C1 = sizeof(U) >= 4;
|
|
// sizeof(U) >= 4 [U = U (decltype(T))]
|
|
|
|
template<typename Y, char V>
|
|
concept C2 = C1<Y{}, V>;
|
|
// sizeof(U) >= 4 [U = V (decltype(Y{}))]
|
|
|
|
template<char W>
|
|
constexpr int foo() requires C2<int, W> { return 1; }
|
|
// sizeof(U) >= 4 [U = W (decltype(int{}))]
|
|
|
|
template<char X>
|
|
// expected-note@+1{{candidate function}}
|
|
constexpr int foo() requires C1<1, X> && true { return 2; }
|
|
// sizeof(U) >= 4 [U = X (decltype(1))]
|
|
|
|
static_assert(foo<'a'>() == 2);
|
|
|
|
template<char Z>
|
|
// expected-note@+1{{candidate function}}
|
|
constexpr int foo() requires C2<long long, Z> && true { return 3; }
|
|
// sizeof(U) >= 4 [U = Z (decltype(long long{}))]
|
|
|
|
static_assert(foo<'a'>() == 3);
|
|
// expected-error@-1{{call to 'foo' is ambiguous}}
|