aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C65
1 files changed, 65 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C b/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C
new file mode 100644
index 00000000000..089db2ba013
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C
@@ -0,0 +1,65 @@
+// { dg-do compile { target c++2a } }
+
+template<typename ...>
+constexpr bool r () { return true; }
+
+template<typename ... Ts>
+ requires r<Ts...>() // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires ++N // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N++ // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N == 0 // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N ? true : false // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N = 0 // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N + 1 // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N - 1 // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N.x // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N->x && true // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N && N
+void f() { }
+
+template<typename T, T N>
+ requires N || N
+void f() { }
+
+template<typename T, T N>
+ requires N || !N // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires N[0] // { dg-error "enclose" }
+void f() { }
+
+template<typename T, T N>
+ requires static_cast<bool>(N) // { dg-error "enclose" }
+void f() { }
+