| // RUN: %clang_cc1 -std=c++20 -verify %s |
| // RUN: %clang_cc1 -std=c++23 -verify %s |
| |
| namespace PR52905 { |
| template <class> concept C = true; |
| |
| struct A { |
| int begin(); |
| int begin() const; |
| }; |
| |
| template <class T> |
| concept Beginable = requires (T t) { |
| { t.begin } -> C; |
| // expected-note@-1 {{because 't.begin' would be invalid: reference to non-static member function must be called}} |
| }; |
| |
| static_assert(Beginable<A>); // expected-error {{static assertion failed}} |
| // expected-note@-1 {{does not satisfy 'Beginable'}} |
| } // namespace PR52905 |
| |
| namespace PR52909a { |
| |
| template<class> constexpr bool B = true; |
| template<class T> concept True = B<T>; |
| |
| template <class T> |
| int foo(T t) requires requires { // expected-note {{candidate template ignored: constraints not satisfied}} |
| {t.begin} -> True; // expected-note {{because 't.begin' would be invalid: reference to non-static member function must be called}} |
| } |
| {} |
| |
| struct A { int begin(); }; |
| auto x = foo(A()); // expected-error {{no matching function for call to 'foo'}} |
| |
| } // namespace PR52909a |
| |
| namespace PR52909b { |
| |
| template<class> concept True = true; |
| |
| template<class T> concept C = requires { |
| { T::begin } -> True; // expected-note {{because 'T::begin' would be invalid: reference to overloaded function could not be resolved}} |
| }; |
| |
| struct A { |
| static void begin(int); |
| static void begin(double); |
| }; |
| |
| static_assert(C<A>); // expected-error {{static assertion failed}} |
| // expected-note@-1 {{because 'A' does not satisfy 'C'}} |
| |
| } // namespace PR52909b |
| |
| namespace PR53075 { |
| template<class> concept True = true; |
| |
| template<class T> concept C = requires { |
| { &T::f } -> True; // expected-note {{because '&T::f' would be invalid: reference to overloaded function could not be resolved}} |
| }; |
| |
| struct S { |
| int *f(); |
| int *f() const; |
| }; |
| |
| static_assert(C<S>); // expected-error {{static assertion failed}} |
| // expected-note@-1 {{because 'S' does not satisfy 'C'}} |
| |
| } // namespace PR53075 |