| // RUN: %clang_cc1 -std=c++2a -verify %s |
| // RUN: %clang_cc1 -std=c++2a -verify %s -fno-concept-satisfaction-caching -DNO_CACHE |
| // expected-no-diagnostics |
| |
| template<typename T> |
| concept C = (f(T()), true); |
| |
| template<typename T> |
| constexpr bool foo() { return false; } |
| |
| template<typename T> |
| requires (f(T()), true) |
| constexpr bool foo() requires (f(T()), true) { return true; } |
| |
| namespace a { |
| struct A {}; |
| constexpr void f(A a) {} |
| } |
| |
| static_assert(C<a::A>); |
| static_assert(foo<a::A>()); |
| |
| namespace a { |
| // This makes calls to f ambiguous, but the second check will still succeed |
| // because the constraint satisfaction results are cached. |
| constexpr void f(A a, int = 2) {} |
| } |
| #ifdef NO_CACHE |
| static_assert(!C<a::A>); |
| static_assert(!foo<a::A>()); |
| #else |
| static_assert(C<a::A>); |
| static_assert(foo<a::A>()); |
| #endif |