From 15ad244670a9ef0bf93b7c8a598586d4a841b197 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Mon, 16 Jan 2023 07:29:38 +0100 Subject: [PATCH] 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 --- .../SemaCXX/invalid-requirement-requires-expr.cpp | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 clang/test/SemaCXX/invalid-requirement-requires-expr.cpp 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 0000000..097ada3 --- /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 +struct A { static constexpr bool far(); }; +class B { + bool data_member; + friend struct A<1>; +}; + +template<> +constexpr bool A<0>::far() { return true; } + +template +constexpr bool A::far() { + return requires(B b) { + b.data_member; + requires A::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}} -- 2.7.4