// RUN: %clang_cc1 -std=c++20 -verify %s template requires(sizeof(T) > 2) || T::value // #FOO_REQ void Foo(T){}; // #FOO template void TrailingReturn(T) // #TRAILING requires(sizeof(T) > 2) || // #TRAILING_REQ T::value // #TRAILING_REQ_VAL {}; template struct HasValue { static constexpr bool value = B; }; static_assert(sizeof(HasValue) <= 2); template struct HasValueLarge { static constexpr bool value = B; int I; }; static_assert(sizeof(HasValueLarge) > 2); void usage() { // Passes the 1st check, short-circuit so the 2nd ::value is not evaluated. Foo(1.0); TrailingReturn(1.0); // Fails the 1st check, but has a ::value, so the check happens correctly. Foo(HasValue{}); TrailingReturn(HasValue{}); // Passes the 1st check, but would have passed the 2nd one. Foo(HasValueLarge{}); TrailingReturn(HasValueLarge{}); // Fails the 1st check, fails 2nd because there is no ::value. Foo(true); // expected-error@-1{{no matching function for call to 'Foo'}} // expected-note@#FOO{{candidate template ignored: constraints not satisfied [with T = bool]}} // expected-note@#FOO_REQ{{because 'sizeof(_Bool) > 2' (1 > 2) evaluated to false}} // expected-note@#FOO_REQ{{because substituted constraint expression is ill-formed: type 'bool' cannot be used prior to '::' because it has no members}} TrailingReturn(true); // expected-error@-1{{no matching function for call to 'TrailingReturn'}} // expected-note@#TRAILING{{candidate template ignored: constraints not satisfied [with T = bool]}} // expected-note@#TRAILING_REQ{{because 'sizeof(_Bool) > 2' (1 > 2) evaluated to false}} // expected-note@#TRAILING_REQ_VAL{{because substituted constraint expression is ill-formed: type 'bool' cannot be used prior to '::' because it has no members}} // Fails the 1st check, fails 2nd because ::value is false. Foo(HasValue{}); // expected-error@-1 {{no matching function for call to 'Foo'}} // expected-note@#FOO{{candidate template ignored: constraints not satisfied [with T = HasValue]}} // expected-note@#FOO_REQ{{because 'sizeof(HasValue) > 2' (1 > 2) evaluated to false}} // expected-note@#FOO_REQ{{and 'HasValue::value' evaluated to false}} TrailingReturn(HasValue{}); // expected-error@-1 {{no matching function for call to 'TrailingReturn'}} // expected-note@#TRAILING{{candidate template ignored: constraints not satisfied [with T = HasValue]}} // expected-note@#TRAILING_REQ{{because 'sizeof(HasValue) > 2' (1 > 2) evaluated to false}} // expected-note@#TRAILING_REQ_VAL{{and 'HasValue::value' evaluated to false}} }