r322746 - [ASTMatchers] Add isNoReturn() match narrower for FunctionDeclarations
Roman Lebedev via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 17 11:40:55 PST 2018
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()))));
More information about the cfe-commits
mailing list