[clang] 15ad244 - Add test for an invalid requirement in requires expr.

Utkarsh Saxena via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 16 03:28:59 PST 2023


Author: Utkarsh Saxena
Date: 2023-01-16T12:28:49+01:00
New Revision: 15ad244670a9ef0bf93b7c8a598586d4a841b197

URL: https://github.com/llvm/llvm-project/commit/15ad244670a9ef0bf93b7c8a598586d4a841b197
DIFF: https://github.com/llvm/llvm-project/commit/15ad244670a9ef0bf93b7c8a598586d4a841b197.diff

LOG: Add test for an invalid requirement in requires expr.

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

Added: 
    clang/test/SemaCXX/invalid-requirement-requires-expr.cpp

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/clang/test/SemaCXX/invalid-requirement-requires-expr.cpp b/clang/test/SemaCXX/invalid-requirement-requires-expr.cpp
new file mode 100644
index 000000000000..097ada3caa13
--- /dev/null
+++ b/clang/test/SemaCXX/invalid-requirement-requires-expr.cpp
@@ -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}}


        


More information about the cfe-commits mailing list