mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
babdef27c5
This reverts commit 95d94a6775
.
This implements the deferred concepts instantiation, which should allow
the libstdc++ ranges to properly compile, and for the CRTP to work for
constrained functions.
Since the last attempt, this has fixed the issues from @wlei and
@mordante.
Differential Revision: https://reviews.llvm.org/D126907
84 lines
2.8 KiB
C++
84 lines
2.8 KiB
C++
// RUN: %clang_cc1 -std=c++2a -x c++ %s -Wno-unused-value -verify
|
|
|
|
template <typename... Args> requires ((sizeof(Args) == 1), ...)
|
|
// expected-note@-1 {{because '(sizeof(int) == 1) , (sizeof(char) == 1) , (sizeof(int) == 1)' evaluated to false}}
|
|
void f1(Args&&... args) { }
|
|
// expected-note@-1 {{candidate template ignored: constraints not satisfied [with Args = <int, char, int>]}}
|
|
|
|
using f11 = decltype(f1('a'));
|
|
using f12 = decltype(f1(1, 'b'));
|
|
using f13 = decltype(f1(1, 'b', 2));
|
|
// expected-error@-1 {{no matching function for call to 'f1'}}
|
|
|
|
template <typename... Args>
|
|
void f2(Args&&... args) requires ((sizeof(args) == 1), ...) { }
|
|
// expected-note@-1 {{candidate template ignored: constraints not satisfied [with Args = <int, char, int>]}}
|
|
// expected-note@-2 {{because '(sizeof (args) == 1) , (sizeof (args) == 1) , (sizeof (args) == 1)' evaluated to false}}
|
|
|
|
using f21 = decltype(f2('a'));
|
|
using f22 = decltype(f2(1, 'b'));
|
|
using f23 = decltype(f2(1, 'b', 2));
|
|
// expected-error@-1 {{no matching function for call to 'f2'}}
|
|
|
|
template <typename... Args> requires ((sizeof(Args) == 1), ...)
|
|
// expected-note@-1 {{because '(sizeof(int) == 1) , (sizeof(char) == 1) , (sizeof(int) == 1)' evaluated to false}}
|
|
void f3(Args&&... args) requires ((sizeof(args) == 1), ...) { }
|
|
// expected-note@-1 {{candidate template ignored: constraints not satisfied [with Args = <int, char, int>]}}
|
|
|
|
using f31 = decltype(f3('a'));
|
|
using f32 = decltype(f3(1, 'b'));
|
|
using f33 = decltype(f3(1, 'b', 2));
|
|
// expected-error@-1 {{no matching function for call to 'f3'}}
|
|
|
|
template<typename T>
|
|
struct S {
|
|
template<typename U>
|
|
static constexpr auto f(U const index) requires(index, true) {
|
|
return true;
|
|
}
|
|
};
|
|
|
|
static_assert(S<void>::f(1));
|
|
|
|
// Similar to the 'S' test, but tries to use 'U' in the requires clause.
|
|
template <typename T2>
|
|
struct S1 {
|
|
// expected-note@+3 {{candidate template ignored: constraints not satisfied [with U = int]}}
|
|
// expected-note@+3 {{because substituted constraint expression is ill-formed: type 'int' cannot be used prior to '::' because it has no members}}
|
|
template <typename U>
|
|
static constexpr auto f(U const index)
|
|
requires(U::foo)
|
|
{ return true; }
|
|
};
|
|
|
|
// expected-error@+1 {{no matching function for call to 'f'}}
|
|
static_assert(S1<void>::f(1));
|
|
|
|
constexpr auto value = 0;
|
|
|
|
template<typename T>
|
|
struct S2 {
|
|
template<typename = void> requires(value, true)
|
|
static constexpr auto f() requires(value, true) {
|
|
}
|
|
};
|
|
|
|
static_assert((S2<int>::f(), true));
|
|
|
|
template<typename T>
|
|
struct S3 {
|
|
template<typename... Args> requires true
|
|
static constexpr void f(Args...) { }
|
|
};
|
|
|
|
static_assert((S3<int>::f(), true));
|
|
|
|
template<typename T>
|
|
struct S4 {
|
|
template<typename>
|
|
constexpr void foo() requires (decltype(this)(), true) { }
|
|
constexpr void goo() requires (decltype(this)(), true) { }
|
|
};
|
|
|
|
static_assert((S4<int>{}.foo<int>(), S4<int>{}.goo(), true));
|