Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / CXX / temp / temp.param / p10-2a.cpp
blob4f5fdd3b4809ac577c8f36aacc6b1698b83795ab
1 // RUN: %clang_cc1 -std=c++2a -x c++ -verify %s
3 template<typename T>
4 concept C1 = sizeof(T) == 1;
5 // expected-note@-1 2{{because 'sizeof(short) == 1' (2 == 1) evaluated to false}}
6 // expected-note@-2 {{because 'sizeof(int) == 1' (4 == 1) evaluated to false}}
8 template<C1 T> // expected-note {{because 'int' does not satisfy 'C1'}}
9 using A = T;
11 using a1 = A<int>; // expected-error {{constraints not satisfied for alias template 'A' [with T = int]}}
12 using a2 = A<char>;
14 template<typename T>
15 concept C2 = sizeof(T) == 2;
16 // expected-note@-1 {{because 'sizeof(char) == 2' (1 == 2) evaluated to false}}
18 template<C1 T1, C2 T2>
19 // expected-note@-1 2{{because 'short' does not satisfy 'C1'}}
20 // expected-note@-2 {{because 'char' does not satisfy 'C2'}}
21 using B = T1;
23 using b1 = B<char, short>;
24 using b2 = B<char, char>; // expected-error {{constraints not satisfied for alias template 'B' [with T1 = char, T2 = char]}}
25 using b3 = B<short, short>; // expected-error {{constraints not satisfied for alias template 'B' [with T1 = short, T2 = short]}}
26 using b4 = B<short, char>; // expected-error {{constraints not satisfied for alias template 'B' [with T1 = short, T2 = char]}}
28 template<typename... T>
29 concept C3 = (sizeof(T) + ...) == 12;
30 // expected-note@-1 {{because 'sizeof(char[11]) == 12' (11 == 12) evaluated to false}}
31 // expected-note@-2 {{because 'sizeof(char[10]) == 12' (10 == 12) evaluated to false}}
32 // expected-note@-3 3{{because 'sizeof(int) == 12' (4 == 12) evaluated to false}}
33 // expected-note@-4 6{{because 'sizeof(short) == 12' (2 == 12) evaluated to false}}
35 template<C3 T1, C3 T2, C3 T3>
36 // expected-note@-1 {{because 'char[11]' does not satisfy 'C3'}}
37 // expected-note@-2 {{because 'char[10]' does not satisfy 'C3'}}
38 using C = T2;
40 using c1 = C<char[12], int[3], short[6]>;
41 using c2 = C<char[12], char[11], char[10]>;
42 // expected-error@-1 {{constraints not satisfied for alias template 'C' [with T1 = char[12], T2 = char[11], T3 = char[10]]}}
43 using c3 = C<char[12], char[12], char[10]>;
44 // expected-error@-1 {{constraints not satisfied for alias template 'C' [with T1 = char[12], T2 = char[12], T3 = char[10]]}}
46 template<C3... Ts>
47 // expected-note@-1 {{because 'int' does not satisfy 'C3'}}
48 // expected-note@-2 2{{and 'int' does not satisfy 'C3'}}
49 // expected-note@-3 {{because 'short' does not satisfy 'C3'}}
50 // expected-note@-4 5{{and 'short' does not satisfy 'C3'}}
51 using D = int;
53 using d1 = D<char[12], int[3], short[6]>;
54 using d2 = D<int, int, int>;
55 // expected-error@-1 {{constraints not satisfied for alias template 'D' [with Ts = <int, int, int>}}
56 using d3 = D<short, short, short, short, short, short>;
57 // expected-error@-1 {{constraints not satisfied for alias template 'D' [with Ts = <short, short, short, short, short, short>}}
59 template<typename T>
60 concept C4 = sizeof(T) == 4;
61 // expected-note@-1 3{{because 'sizeof(char) == 4' (1 == 4) evaluated to false}}
63 template<C4... Ts>
64 // expected-note@-1 2{{because 'char' does not satisfy 'C4'}}
65 // expected-note@-2 {{and 'char' does not satisfy 'C4'}}
66 using E = int;
68 using e1 = E<int>;
69 using e2 = E<char, int>; // expected-error {{constraints not satisfied for alias template 'E' [with Ts = <char, int>]}}
70 using e3 = E<char, char>; // expected-error {{constraints not satisfied for alias template 'E' [with Ts = <char, char>]}}
71 using e4 = E<>;
73 template<typename T, typename U>
74 constexpr bool is_same_v = false;
76 template<typename T>
77 constexpr bool is_same_v<T, T> = true;
79 template<typename T, typename U>
80 concept Same = is_same_v<T, U>; // expected-note {{because 'is_same_v<long, int>' evaluated to false}}
82 template<Same<int> T> // expected-note {{because 'Same<long, int>' evaluated to false}}
83 using F = T;
85 using f1 = F<int>;
86 using f2 = F<long>; // expected-error {{constraints not satisfied for alias template 'F' [with T = long]}}
88 template<typename T, typename... Ts>
89 concept OneOf = (is_same_v<T, Ts> || ...);
90 // expected-note@-1 2{{because 'is_same_v<char, char[1]>' evaluated to false}}
91 // expected-note@-2 2{{and 'is_same_v<char, char[2]>' evaluated to false}}
92 // expected-note@-3 {{because 'is_same_v<short, int>' evaluated to false}}
93 // expected-note@-4 {{and 'is_same_v<short, long>' evaluated to false}}
94 // expected-note@-5 {{and 'is_same_v<short, char>' evaluated to false}}
95 // expected-note@-6 3{{because 'is_same_v<int, char[1]>' evaluated to false}}
96 // expected-note@-7 3{{and 'is_same_v<int, char[2]>' evaluated to false}}
97 // expected-note@-8 2{{because 'is_same_v<std::nullptr_t, char>' evaluated to false}}
98 // expected-note@-9 2{{and 'is_same_v<std::nullptr_t, int>' evaluated to false}}
100 template<OneOf<char[1], char[2]> T, OneOf<int, long, char> U>
101 // expected-note@-1 2{{because 'OneOf<char, char[1], char[2]>' evaluated to false}}
102 // expected-note@-2 {{because 'OneOf<short, int, long, char>' evaluated to false}}
103 using G = T;
105 using g1 = G<char[1], int>;
106 using g2 = G<char, int>; // expected-error{{constraints not satisfied for alias template 'G' [with T = char, U = int]}}
107 using g3 = G<char[1], short>; // expected-error{{constraints not satisfied for alias template 'G' [with T = char[1], U = short]}}
108 using g4 = G<char, short>; // expected-error{{constraints not satisfied for alias template 'G' [with T = char, U = short]}}
110 template<OneOf<char[1], char[2]>... Ts>
111 // expected-note@-1 2{{because 'OneOf<int, char[1], char[2]>' evaluated to false}}
112 // expected-note@-2 {{and 'OneOf<int, char[1], char[2]>' evaluated to false}}
113 using H = int;
115 using h1 = H<char[1], int>;
116 // expected-error@-1 {{constraints not satisfied for alias template 'H' [with Ts = <char[1], int>]}}
117 using h2 = H<int, int>;
118 // expected-error@-1 {{constraints not satisfied for alias template 'H' [with Ts = <int, int>]}}
119 using h3 = H<char[1], char[2]>;
121 template<OneOf<char, int> auto x>
122 // expected-note@-1 {{because 'OneOf<decltype(nullptr), char, int>' evaluated to false}}
123 using I = int;
125 using i1 = I<1>;
126 using i2 = I<'a'>;
127 using i3 = I<nullptr>;
128 // expected-error@-1 {{constraints not satisfied for alias template 'I' [with x = nullptr]}}
130 template<OneOf<char, int> auto... x>
131 // expected-note@-1 {{because 'OneOf<decltype(nullptr), char, int>' evaluated to false}}
132 using J = int;
134 using j1 = J<1, 'b'>;
135 using j2 = J<'a', nullptr>;
136 // expected-error@-1 {{constraints not satisfied for alias template 'J' [with x = <'a', nullptr>]}}
138 template<OneOf<char, int> auto &x>
139 // expected-error@-1 {{constrained placeholder types other than simple 'auto' on non-type template parameters not supported yet}}
140 using K = int;