File: instantiate-requires-clause.cpp

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (83 lines) | stat: -rw-r--r-- 2,894 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// 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));