cxx2a-constraint-caching.cpp 791 Bytes
// 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 {};
  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.
  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