llvm/clang/test/SemaTemplate/cxx2a-constraint-caching.cpp

// RUN:  %clang_cc1 -std=c++2a -verify %s
// 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) {}
}
static_assert(C<a::A>);
static_assert(foo<a::A>());