1 // RUN: %clang_cc1 -std=c++20 -verify %s
2 // RUN: %clang_cc1 -std=c++20 -verify %s -DDEPENDENT_OR
5 // This causes the || below to be a CXXOperatorCallExpr not a BinaryOperator.
6 struct A
{}; bool operator||(A
, A
);
10 template<typename T
> struct X
{ static constexpr bool value
= T::value
; }; // expected-error {{cannot be used prior to '::'}}
11 struct False
{ static constexpr bool value
= false; };
12 struct True
{ static constexpr bool value
= true; };
14 template<typename T
> concept C
= true;
16 template<bool B
, typename T
> constexpr int test
= 0;
17 template<bool B
, typename T
> requires C
<T
> constexpr int test
<B
, T
> = 1;
18 template<bool B
, typename T
> requires (B
&& C
<T
>) || (X
<T
>::value
&& C
<T
>) constexpr int test
<B
, T
> = 2; // expected-note {{instantiation of}} expected-note {{while substituting}}
19 static_assert(test
<true, False
> == 2);
20 static_assert(test
<true, True
> == 2);
21 static_assert(test
<true, char> == 2); // satisfaction of second term of || not considered
22 static_assert(test
<false, False
> == 1);
23 static_assert(test
<false, True
> == 2); // constraints are partially ordered
24 static_assert(test
<false, char> == 1); // expected-note {{while}} expected-note {{during}}