// PR c++/101904
// Verify we stop at the first bad argument conversion when considering a
// candidate during overload resolution.
template<class T>
struct A { typedef typename T::type type; };
struct B {
  // A conversion function that always induces a hard error when instantiated.
  template<class T> B(T, typename A<T>::type = 0);
};
struct C {
  template<class T> void f(T, typename A<T>::type); // #1
  template<class T> void f(T, T) const;             // #2
  static void g(int*, B);                           // #3
  static void g(int, int);                          // #4
#if __cpp_ref_qualifiers
  void h(B) &;                                      // #5
  void h(int) &&;                                   // #6
#endif
};
int main() {
  const C c;
  // The bad conversion for the 'this' argument should preclude us from further
  // considering the non-const #1 (which would have caused a hard error during
  // instantiation).  This behavior is essentially DR 1391 extended to the
  // 'this' argument.
  c.f(0, 0); // resolves to #2
  c.f<int>(0, 0);
  // Likewise for the bad conversion for the 1st argument in #3.
  C::g(42, 42); // resolves to #4
#if __cpp_ref_qualifiers
  // Likewise for the bad 'this' conversion in #5.
  C().h(0); // resolves to #6
#endif
}
#if __cpp_concepts
// Test the same calls in a SFINAE context.
template<class T>
concept D = requires (const T t) {
  t.f(0, 0);
  t.template f<int>(0, 0);
  T::g(42, 42);
  T().h(0);
};
static_assert(D<C>);
// Test that when there's no strictly viable candidate and we're in a
// SFINAE context, we still stop at the first bad argument conversion.
template<class T>
concept E = requires { T().h(nullptr); };
static_assert(!E<C>);
#endif