Izaron created this revision. Izaron added a reviewer: aaron.ballman. Izaron requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Support C++20 `consteval` functions and C++2b `if consteval` for AST Matchers. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D117613 Files: clang/docs/LibASTMatchersReference.html clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
Index: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -1790,6 +1790,31 @@ EXPECT_TRUE(matches("void f() noexcept;", functionProtoType(isNoThrow()))); } +TEST_P(ASTMatchersTest, IsConsteval) { + if (!GetParam().isCXX20OrLater()) { + return; + } + + EXPECT_TRUE(matches("consteval int bar();", + functionDecl(hasName("bar"), isConsteval()))); + EXPECT_TRUE(notMatches("constexpr int bar();", + functionDecl(hasName("bar"), isConsteval()))); + EXPECT_TRUE( + notMatches("int bar();", functionDecl(hasName("bar"), isConsteval()))); +} + +TEST_P(ASTMatchersTest, IsConsteval_MatchesIfConsteval) { + if (!GetParam().isCXX20OrLater()) { + return; + } + + EXPECT_TRUE(matches("void baz() { if consteval {} }", ifStmt(isConsteval()))); + EXPECT_TRUE(notMatches("void baz() { if constexpr(1 > 0) {} }", + ifStmt(isConsteval()))); + EXPECT_TRUE( + notMatches("void baz() { if (1 > 0) {} }", ifStmt(isConsteval()))); +} + TEST_P(ASTMatchersTest, IsConstexpr) { if (!GetParam().isCXX11OrLater()) { return; Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -404,6 +404,7 @@ REGISTER_MATCHER(isComparisonOperator); REGISTER_MATCHER(isConst); REGISTER_MATCHER(isConstQualified); + REGISTER_MATCHER(isConsteval); REGISTER_MATCHER(isConstexpr); REGISTER_MATCHER(isCopyAssignmentOperator); REGISTER_MATCHER(isCopyConstructor); Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -5170,6 +5170,23 @@ return FnTy->isNothrow(); } +/// Matches consteval function declarations, +/// and if consteval. +/// +/// Given: +/// \code +/// consteval int bar(); +/// void baz() { if consteval {} } +/// \endcode +/// functionDecl(isConsteval()) +/// matches the declaration of bar. +/// ifStmt(isConsteval()) +/// matches the if statement in baz. +AST_POLYMORPHIC_MATCHER(isConsteval, + AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, IfStmt)) { + return Node.isConsteval(); +} + /// Matches constexpr variable and function declarations, /// and if constexpr. /// Index: clang/docs/LibASTMatchersReference.html =================================================================== --- clang/docs/LibASTMatchersReference.html +++ clang/docs/LibASTMatchersReference.html @@ -4201,6 +4201,20 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations, + and if consteval. + +Given: + consteval int bar(); + void baz() { if consteval {} } +functionDecl(isConsteval()) + matches the declaration of bar. +ifStmt(isConsteval()) + matches the if statement in baz. +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, and if constexpr. @@ -4473,6 +4487,20 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConsteval2')"><a name="isConsteval2Anchor">isConsteval</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isConsteval2"><pre>Matches consteval function declarations, + and if consteval. + +Given: + consteval int bar(); + void baz() { if consteval {} } +functionDecl(isConsteval()) + matches the declaration of bar. +ifStmt(isConsteval()) + matches the if statement in baz. +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, and if constexpr.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits