aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-pr71368.C28
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> );
+}