// RUN: %clang_cc1 -std=c++2a -verify %s struct S2 {}; // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'S1' to 'const S2' for 1st argument}} // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'S1' to 'S2' for 1st argument}} // expected-note@-3 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} struct S1 { void foo() const requires true {} void foo() const requires false {} void bar() const requires false {} // expected-note@-1 {{because 'false' evaluated to false}} operator bool() const requires true { return true; } explicit operator bool() const requires false; explicit operator S2() const requires false; // expected-note@-1 {{candidate function not viable: constraints not satisfied}} // expected-note@-2 {{because 'false' evaluated to false}} }; void foo() { S1().foo(); S1().bar(); // expected-error@-1 {{invalid reference to function 'bar': constraints not satisfied}} (void) static_cast(S1()); (void) static_cast(S1()); // expected-error@-1 {{no matching conversion for static_cast from 'S1' to 'S2'}} } // Test that constraints are checked before implicit conversions are formed. template struct invalid_template { using X = typename T::non_existant; }; struct A { template::aadasas> operator T() {} }; void foo(int) requires false; void foo(A) requires true; struct S { void foo(int) requires false; void foo(A) requires true; S(A) requires false; S(double) requires true; ~S() requires false; // expected-note@-1 2{{because 'false' evaluated to false}} ~S() requires true; operator int() requires true; operator int() requires false; }; void bar() { foo(A{}); S{1.}.foo(A{}); // expected-error@-1{{invalid reference to function '~S': constraints not satisfied}} // Note - this behavior w.r.t. constrained dtors is a consequence of current // wording, which does not invoke overload resolution when a dtor is called. // P0848 is set to address this issue. S s = 1; // expected-error@-1{{invalid reference to function '~S': constraints not satisfied}} int a = s; }