Author: lebedevri Date: Wed Jan 17 11:40:55 2018 New Revision: 322746 URL: http://llvm.org/viewvc/llvm-project?rev=322746&view=rev Log: [ASTMatchers] Add isNoReturn() match narrower for FunctionDeclarations
Reviewers: aaron.ballman Reviewed By: aaron.ballman Subscribers: dblaikie, klimek, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D41455 Modified: cfe/trunk/docs/LibASTMatchersReference.html cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Modified: cfe/trunk/docs/LibASTMatchersReference.html URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=322746&r1=322745&r2=322746&view=diff ============================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html (original) +++ cfe/trunk/docs/LibASTMatchersReference.html Wed Jan 17 11:40:55 2018 @@ -2843,6 +2843,20 @@ namespaceDecl(isInline()) will match n:: </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. + +Given + void nope(); + [[noreturn]] void a(); + __attribute__((noreturn)) void b(); + struct c { [[noreturn]] c(); }; +functionDecl(isNoReturn()) + matches all of those except + void nope(); +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=322746&r1=322745&r2=322746&view=diff ============================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original) +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Wed Jan 17 11:40:55 2018 @@ -3567,6 +3567,24 @@ AST_POLYMORPHIC_MATCHER_P(parameterCount return Node.getNumParams() == N; } +/// \brief Matches \c FunctionDecls that have a noreturn attribute. +/// +/// Given +/// \code +/// void nope(); +/// [[noreturn]] void a(); +/// __attribute__((noreturn)) void b(); +/// struct c { [[noreturn]] c(); }; +/// \endcode +/// functionDecl(isNoReturn()) +/// matches all of those except +/// \code +/// void nope(); +/// \endcode +AST_MATCHER(FunctionDecl, isNoReturn) { + return Node.isNoReturn(); +} + /// \brief Matches the return type of a function declaration. /// /// Given: Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=322746&r1=322745&r2=322746&view=diff ============================================================================== --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original) +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Wed Jan 17 11:40:55 2018 @@ -354,6 +354,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(isMemberInitializer); REGISTER_MATCHER(isMoveAssignmentOperator); REGISTER_MATCHER(isMoveConstructor); + REGISTER_MATCHER(isNoReturn); REGISTER_MATCHER(isNoThrow); REGISTER_MATCHER(isOverride); REGISTER_MATCHER(isPrivate); Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp?rev=322746&r1=322745&r2=322746&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Wed Jan 17 11:40:55 2018 @@ -1770,6 +1770,84 @@ TEST(IsExplicitTemplateSpecialization, functionDecl(isExplicitTemplateSpecialization()))); } +TEST(TypeMatching, MatchesNoReturn) { + EXPECT_TRUE(notMatches("void func();", functionDecl(isNoReturn()))); + EXPECT_TRUE(notMatches("void func() {}", functionDecl(isNoReturn()))); + + EXPECT_TRUE(notMatchesC("void func();", functionDecl(isNoReturn()))); + EXPECT_TRUE(notMatchesC("void func() {}", functionDecl(isNoReturn()))); + + EXPECT_TRUE( + notMatches("struct S { void func(); };", functionDecl(isNoReturn()))); + EXPECT_TRUE( + notMatches("struct S { void func() {} };", functionDecl(isNoReturn()))); + + EXPECT_TRUE(notMatches("struct S { static void func(); };", + functionDecl(isNoReturn()))); + EXPECT_TRUE(notMatches("struct S { static void func() {} };", + functionDecl(isNoReturn()))); + + EXPECT_TRUE(notMatches("struct S { S(); };", functionDecl(isNoReturn()))); + EXPECT_TRUE(notMatches("struct S { S() {} };", functionDecl(isNoReturn()))); + + // --- + + EXPECT_TRUE(matches("[[noreturn]] void func();", functionDecl(isNoReturn()))); + EXPECT_TRUE( + matches("[[noreturn]] void func() {}", functionDecl(isNoReturn()))); + + EXPECT_TRUE(matches("struct S { [[noreturn]] void func(); };", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matches("struct S { [[noreturn]] void func() {} };", + functionDecl(isNoReturn()))); + + EXPECT_TRUE(matches("struct S { [[noreturn]] static void func(); };", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matches("struct S { [[noreturn]] static void func() {} };", + functionDecl(isNoReturn()))); + + EXPECT_TRUE( + matches("struct S { [[noreturn]] S(); };", functionDecl(isNoReturn()))); + EXPECT_TRUE(matches("struct S { [[noreturn]] S() {} };", + functionDecl(isNoReturn()))); + + // --- + + EXPECT_TRUE(matches("__attribute__((noreturn)) void func();", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matches("__attribute__((noreturn)) void func() {}", + functionDecl(isNoReturn()))); + + EXPECT_TRUE(matches("struct S { __attribute__((noreturn)) void func(); };", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matches("struct S { __attribute__((noreturn)) void func() {} };", + functionDecl(isNoReturn()))); + + EXPECT_TRUE( + matches("struct S { __attribute__((noreturn)) static void func(); };", + functionDecl(isNoReturn()))); + EXPECT_TRUE( + matches("struct S { __attribute__((noreturn)) static void func() {} };", + functionDecl(isNoReturn()))); + + EXPECT_TRUE(matches("struct S { __attribute__((noreturn)) S(); };", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matches("struct S { __attribute__((noreturn)) S() {} };", + functionDecl(isNoReturn()))); + + // --- + + EXPECT_TRUE(matchesC("__attribute__((noreturn)) void func();", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matchesC("__attribute__((noreturn)) void func() {}", + functionDecl(isNoReturn()))); + + EXPECT_TRUE(matchesC("_Noreturn void func();", + functionDecl(isNoReturn()))); + EXPECT_TRUE(matchesC("_Noreturn void func() {}", + functionDecl(isNoReturn()))); +} + TEST(TypeMatching, MatchesBool) { EXPECT_TRUE(matches("struct S { bool func(); };", cxxMethodDecl(returns(booleanType())))); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits