167c608a9SSaar Raz // RUN: %clang_cc1 -std=c++2a -verify %s 2b65b1f32SSaar Raz 3b65b1f32SSaar Raz namespace functions 4b65b1f32SSaar Raz { 5*6da3d66fSErich Keane template<typename T> 6*6da3d66fSErich Keane struct S { foofunctions::S7*6da3d66fSErich Keane static void foo(int) requires false {} 8b65b1f32SSaar Raz // expected-note@-1 3{{because 'false' evaluated to false}} barfunctions::S9*6da3d66fSErich Keane static void bar(int) requires true {} 10*6da3d66fSErich Keane }; 11b65b1f32SSaar Raz 12b65b1f32SSaar Raz void a(int); 13b65b1f32SSaar Raz void a(double); 14b65b1f32SSaar Raz baz()15b65b1f32SSaar Raz void baz() { 16*6da3d66fSErich Keane S<int>::foo(1); // expected-error{{invalid reference to function 'foo': constraints not satisfied}} 17*6da3d66fSErich Keane S<int>::bar(1); 18*6da3d66fSErich Keane void (*p1)(int) = S<int>::foo; // expected-error{{invalid reference to function 'foo': constraints not satisfied}} 19*6da3d66fSErich Keane void (*p3)(int) = S<int>::bar; 20*6da3d66fSErich Keane decltype(S<int>::foo)* a1 = nullptr; // expected-error{{invalid reference to function 'foo': constraints not satisfied}} 21*6da3d66fSErich Keane decltype(S<int>::bar)* a2 = nullptr; 22b65b1f32SSaar Raz } 23b65b1f32SSaar Raz } 24b65b1f32SSaar Raz 25b65b1f32SSaar Raz namespace methods 26b65b1f32SSaar Raz { 27b65b1f32SSaar Raz template<typename T> 28b65b1f32SSaar Raz struct A { foomethods::A29b65b1f32SSaar Raz static void foo(int) requires (sizeof(T) == 1) {} // expected-note 3{{because 'sizeof(char[2]) == 1' (2 == 1) evaluated to false}} barmethods::A30b65b1f32SSaar Raz static void bar(int) requires (sizeof(T) == 2) {} // expected-note 3{{because 'sizeof(char) == 2' (1 == 2) evaluated to false}} 31980517b3SSaar Raz // Make sure the function body is not instantiated before constraints are checked. bazmethods::A32980517b3SSaar Raz static auto baz(int) requires (sizeof(T) == 2) { return T::foo(); } // expected-note{{because 'sizeof(char) == 2' (1 == 2) evaluated to false}} 33b65b1f32SSaar Raz }; 34b65b1f32SSaar Raz baz()35b65b1f32SSaar Raz void baz() { 36b65b1f32SSaar Raz A<char>::foo(1); 37b65b1f32SSaar Raz A<char>::bar(1); // expected-error{{invalid reference to function 'bar': constraints not satisfied}} 38980517b3SSaar Raz A<char>::baz(1); // expected-error{{invalid reference to function 'baz': constraints not satisfied}} 39b65b1f32SSaar Raz A<char[2]>::foo(1); // expected-error{{invalid reference to function 'foo': constraints not satisfied}} 40b65b1f32SSaar Raz A<char[2]>::bar(1); 41b65b1f32SSaar Raz void (*p1)(int) = A<char>::foo; 42b65b1f32SSaar Raz void (*p2)(int) = A<char>::bar; // expected-error{{invalid reference to function 'bar': constraints not satisfied}} 43b65b1f32SSaar Raz void (*p3)(int) = A<char[2]>::foo; // expected-error{{invalid reference to function 'foo': constraints not satisfied}} 44b65b1f32SSaar Raz void (*p4)(int) = A<char[2]>::bar; 45b65b1f32SSaar Raz decltype(A<char>::foo)* a1 = nullptr; 46b65b1f32SSaar Raz decltype(A<char>::bar)* a2 = nullptr; // expected-error{{invalid reference to function 'bar': constraints not satisfied}} 47b65b1f32SSaar Raz decltype(A<char[2]>::foo)* a3 = nullptr; // expected-error{{invalid reference to function 'foo': constraints not satisfied}} 48b65b1f32SSaar Raz decltype(A<char[2]>::bar)* a4 = nullptr; 49b65b1f32SSaar Raz } 50b65b1f32SSaar Raz } 51b65b1f32SSaar Raz 52b65b1f32SSaar Raz namespace operators 53b65b1f32SSaar Raz { 54b65b1f32SSaar Raz template<typename T> 55b65b1f32SSaar Raz struct A { operator -operators::A56b65b1f32SSaar Raz A<T> operator-(A<T> b) requires (sizeof(T) == 1) { return b; } // expected-note{{because 'sizeof(int) == 1' (4 == 1) evaluated to false}} 57b65b1f32SSaar Raz }; 58b65b1f32SSaar Raz baz()59b65b1f32SSaar Raz void baz() { 60b65b1f32SSaar Raz auto* x = &A<int>::operator-; // expected-error{{invalid reference to function 'operator-': constraints not satisfied}} 61b65b1f32SSaar Raz auto y = &A<char>::operator-; 62b65b1f32SSaar Raz } 63b65b1f32SSaar Raz } 64