xref: /llvm-project/clang/test/CXX/expr/expr.prim/expr.prim.req/p3.cpp (revision 67c608a9695496cfc9d3fdf9d0b12b554ac6b4df)
1*67c608a9SSaar Raz // RUN: %clang_cc1 -std=c++2a -x c++ %s -verify
2a0f50d73SSaar Raz 
3a0f50d73SSaar Raz // Examples from standard
4a0f50d73SSaar Raz 
5a0f50d73SSaar Raz template<typename T, typename U>
6a0f50d73SSaar Raz concept convertible_to = requires(T t) { U(t); };
7a0f50d73SSaar Raz 
8a0f50d73SSaar Raz template<typename T>
9a0f50d73SSaar Raz concept R = requires (T i) {
10a0f50d73SSaar Raz   typename T::type;
11a0f50d73SSaar Raz   {*i} -> convertible_to<const typename T::type&>;
12a0f50d73SSaar Raz };
13a0f50d73SSaar Raz 
14a0f50d73SSaar Raz template<typename T> requires R<T> struct S {};
15a0f50d73SSaar Raz 
16a0f50d73SSaar Raz struct T {
17a0f50d73SSaar Raz   using type = int;
18a0f50d73SSaar Raz   type i;
operator *T19a0f50d73SSaar Raz   const type &operator*() { return i; }
20a0f50d73SSaar Raz };
21a0f50d73SSaar Raz 
22a0f50d73SSaar Raz using si = S<T>;
23a0f50d73SSaar Raz 
24a0f50d73SSaar Raz template<typename T>
25a0f50d73SSaar Raz requires requires (T x) { x + x; } // expected-note{{because 'x + x' would be invalid: invalid operands to binary expression ('T' and 'T')}}
add(T a,T b)26a0f50d73SSaar Raz T add(T a, T b) { return a + b; } // expected-note{{candidate template ignored: constraints not satisfied [with T = T]}}
27a0f50d73SSaar Raz 
28a0f50d73SSaar Raz int x = add(1, 2);
29a0f50d73SSaar Raz int y = add(T{}, T{}); // expected-error{{no matching function for call to 'add'}}
30a0f50d73SSaar Raz 
31a0f50d73SSaar Raz template<typename T>
32a0f50d73SSaar Raz concept C = requires (T x) { x + x; }; // expected-note{{because 'x + x' would be invalid: invalid operands to binary expression ('T' and 'T')}}
33a0f50d73SSaar Raz template<typename T> requires C<T> // expected-note{{because 'T' does not satisfy 'C'}}
add2(T a,T b)34a0f50d73SSaar Raz T add2(T a, T b) { return a + b; } // expected-note{{candidate template ignored: constraints not satisfied [with T = T]}}
35a0f50d73SSaar Raz 
36a0f50d73SSaar Raz int z = add2(1, 2);
37a0f50d73SSaar Raz int w = add2(T{}, T{}); // expected-error{{no matching function for call to 'add2'}}