Add test for an invalid requirement in requires expr.
authorUtkarsh Saxena <usx@google.com>
Mon, 16 Jan 2023 06:29:38 +0000 (07:29 +0100)
committerUtkarsh Saxena <usx@google.com>
Mon, 16 Jan 2023 11:28:49 +0000 (12:28 +0100)
The one introduced in D140547 was brittle. Fixing max template depth to
a small value would still test the same issue without causing actual
stack exhaustion.

Differential Revision: https://reviews.llvm.org/D141818

clang/test/SemaCXX/invalid-requirement-requires-expr.cpp [new file with mode: 0644]

diff --git a/clang/test/SemaCXX/invalid-requirement-requires-expr.cpp b/clang/test/SemaCXX/invalid-requirement-requires-expr.cpp
new file mode 100644 (file)
index 0000000..097ada3
--- /dev/null
@@ -0,0 +1,27 @@
+// RUN: %clang -fsyntax-only -std=c++2a -Xclang -verify -ftemplate-depth=5 -ftemplate-backtrace-limit=4 %s
+
+// RequiresExpr contains invalid requirement. (Eg. Highly recurisive template).
+template<int x>
+struct A { static constexpr bool far(); };
+class B {
+    bool data_member;
+    friend struct A<1>;
+};
+
+template<>
+constexpr bool A<0>::far() { return true; }
+
+template<int x>
+constexpr bool A<x>::far() {
+    return requires(B b) {
+      b.data_member;
+      requires A<x-1>::far(); // #Invalid
+      // expected-error@#Invalid {{recursive template instantiation exceeded maximum depth}}
+      // expected-note@#Invalid {{in instantiation}}
+      // expected-note@#Invalid 2 {{while}}
+      // expected-note@#Invalid {{contexts in backtrace}}
+      // expected-note@#Invalid {{increase recursive template instantiation depth}}
+    };
+}
+static_assert(A<1>::far());
+static_assert(!A<6>::far()); // expected-note {{in instantiation of member function}}