// RUN: %clang_cc1 -std=c++20 -verify %s
// RUN: %clang_cc1 -std=c++20 -verify %s -DDEPENDENT_OR
#ifdef DEPENDENT_OR
// This causes the || below to be a CXXOperatorCallExpr not a BinaryOperator.
structA{};booloperator||(A, A);#endifnamespacePR45589{template<typename T>structX{staticconstexprbool value = T::value;};// expected-error {{cannot be used prior to '::'}}
structFalse{staticconstexprbool value =false;};structTrue{staticconstexprbool value =true;};template<typename T> concept C =true;template<bool B,typename T>constexprint test =0;template<bool B,typename T> requires C<T>constexprint test<B, T>=1;template<bool B,typename T>requires(B && C<T>)||(X<T>::value && C<T>)constexprint test<B, T>=2;// expected-error {{non-constant expression}} expected-note {{subexpression}} expected-note {{instantiation of}} expected-note {{while substituting}}
static_assert(test<true, False>==2);static_assert(test<true, True>==2);static_assert(test<true,char>==2);// satisfaction of second term of || not considered
static_assert(test<false, False>==1);static_assert(test<false, True>==2);// constraints are partially ordered
// FIXME: These diagnostics are excessive.
static_assert(test<false,char>==1);// expected-note 2{{while}} expected-note 2{{during}}
}