145
|
1 // PR c++/71368
|
|
2 // { dg-do compile { target c++2a } }
|
|
3
|
|
4 template <class T, class U> concept Same = __is_same_as(T,U);
|
|
5
|
|
6 struct inner;
|
|
7
|
|
8 template<typename X> concept CompoundReq = requires {
|
|
9 // fine with concrete type in trailing type, i.e. inner& instead of X&
|
|
10 { X::inner_member() } -> Same<X&>;
|
|
11 };
|
|
12
|
|
13 template<typename X> concept Concept = requires {
|
|
14 { X::outer_member() } -> CompoundReq;
|
|
15 };
|
|
16
|
|
17 struct inner { static inner& inner_member(); };
|
|
18 struct outer { static inner outer_member(); };
|
|
19
|
|
20 int main()
|
|
21 {
|
|
22 // fine
|
|
23 static_assert( CompoundReq<inner> );
|
|
24 static_assert( CompoundReq<decltype( outer::outer_member() )> );
|
|
25
|
|
26 // ICE
|
|
27 static_assert( Concept<outer> );
|
|
28 }
|