usaxena95 created this revision. usaxena95 added reviewers: ilya-biryukov, erichkeane. Herald added a project: All. usaxena95 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
The one introduced in D140547 <https://reviews.llvm.org/D140547> was brittle. Fixing max template depth to a small value would still test the same issue without causing actual stack exhaustion. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D141818 Files: clang/test/SemaCXX/invalid-requirement-requires-expr.cpp Index: clang/test/SemaCXX/invalid-requirement-requires-expr.cpp =================================================================== --- /dev/null +++ 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}}
Index: clang/test/SemaCXX/invalid-requirement-requires-expr.cpp =================================================================== --- /dev/null +++ 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}}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits