diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C b/gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C new file mode 100644 index 00000000000..c67e632d443 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C @@ -0,0 +1,28 @@ +// PR c++/71368 +// { dg-do compile { target c++2a } } + +template <class T, class U> concept Same = __is_same_as(T,U); + +struct inner; + +template<typename X> concept CompoundReq = requires { + // fine with concrete type in trailing type, i.e. inner& instead of X& + { X::inner_member() } -> Same<X&>; +}; + +template<typename X> concept Concept = requires { + { X::outer_member() } -> CompoundReq; +}; + +struct inner { static inner& inner_member(); }; +struct outer { static inner outer_member(); }; + +int main() +{ + // fine + static_assert( CompoundReq<inner> ); + static_assert( CompoundReq<decltype( outer::outer_member() )> ); + + // ICE + static_assert( Concept<outer> ); +} |