diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp | 51 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-template-argument.cpp | 28 |
2 files changed, 79 insertions, 0 deletions
diff --git a/clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp b/clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp index 95fe35b4591..153d4a56bea 100644 --- a/clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp +++ b/clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp @@ -16,3 +16,54 @@ template<typename T> requires Bar2<T> struct S2 { }; template<typename T> requires Bar2<T> && true struct S2<T> { }; // expected-error@-1{{class template partial specialization is not more specialized than the primary template}} // expected-note@-2{{while calculating associated constraint of template 'S2' here}} + +namespace type_pack { + template<typename... Args> + concept C1 = ((sizeof(Args) >= 0) && ...); + + template<typename A, typename... B> + concept C2 = C1<A, B...>; + + template<typename T> + constexpr void foo() requires C2<T, char, T> { } + + template<typename T> + constexpr void foo() requires C1<T, char, T> && true { } + + static_assert((foo<int>(), true)); +} + +namespace template_pack { + template<typename T> struct S1 {}; + template<typename T> struct S2 {}; + + template<template<typename> typename... Args> + concept C1 = ((sizeof(Args<int>) >= 0) && ...); + + template<template<typename> typename A, template<typename> typename... B> + concept C2 = C1<A, B...>; + + template<template<typename> typename T> + constexpr void foo() requires C2<T, S1, T> { } + + template<template<typename> typename T> + constexpr void foo() requires C1<T, S1, T> && true { } + + static_assert((foo<S2>(), true)); +} + +namespace non_type_pack { + template<int... Args> + concept C1 = ((Args >= 0) && ...); + + template<int A, int... B> + concept C2 = C1<A, B...>; + + template<int T> + constexpr void foo() requires C2<T, 2, T> { } + + template<int T> + constexpr void foo() requires C1<T, 2, T> && true { } + + static_assert((foo<1>(), true)); +} diff --git a/clang/test/SemaTemplate/instantiate-template-argument.cpp b/clang/test/SemaTemplate/instantiate-template-argument.cpp new file mode 100644 index 00000000000..43d5d00c8cb --- /dev/null +++ b/clang/test/SemaTemplate/instantiate-template-argument.cpp @@ -0,0 +1,28 @@ +// 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}}
\ No newline at end of file |