Add a narrowing AST matcher that matches on a FunctionDecl with a non-throwing exception specification.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@254516 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Aaron Ballman 2015-12-02 15:23:59 +00:00
Родитель c6a102dd24
Коммит b5478a7e86
4 изменённых файлов: 52 добавлений и 0 удалений

Просмотреть файл

@ -2236,6 +2236,20 @@ namespaceDecl(isInline()) will match n::m.
</pre></td></tr>
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</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.
Given:
void f();
void g() noexcept;
void h() throw();
void i() throw(int);
void j() noexcept(false);
functionDecl(isNoThrow())
matches the declarations of g, and h, but not f, i or j.
</pre></td></tr>
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
member variable template instantiations.

Просмотреть файл

@ -2942,6 +2942,34 @@ AST_MATCHER(FunctionDecl, isDeleted) {
return Node.isDeleted();
}
/// \brief Matches functions that have a non-throwing exception specification.
///
/// Given:
/// \code
/// void f();
/// void g() noexcept;
/// void h() throw();
/// void i() throw(int);
/// void j() noexcept(false);
/// \endcode
/// functionDecl(isNoThrow())
/// matches the declarations of g, and h, but not f, i or j.
AST_MATCHER(FunctionDecl, isNoThrow) {
const auto *FnTy = Node.getType()->getAs<FunctionProtoType>();
// If the function does not have a prototype, then it is assumed to be a
// throwing function (as it would if the function did not have any exception
// specification).
if (!FnTy)
return false;
// Assume the best for any unresolved exception specification.
if (isUnresolvedExceptionSpec(FnTy->getExceptionSpecType()))
return true;
return FnTy->isNothrow(Node.getASTContext());
}
/// \brief Matches constexpr variable and function declarations.
///
/// Given:

Просмотреть файл

@ -288,6 +288,7 @@ RegistryMaps::RegistryMaps() {
REGISTER_MATCHER(isListInitialization);
REGISTER_MATCHER(isMemberInitializer);
REGISTER_MATCHER(isMoveConstructor);
REGISTER_MATCHER(isNoThrow);
REGISTER_MATCHER(isOverride);
REGISTER_MATCHER(isPrivate);
REGISTER_MATCHER(isProtected);

Просмотреть файл

@ -1716,6 +1716,15 @@ TEST(IsDeleted, MatchesDeletedFunctionDeclarations) {
functionDecl(hasName("Func"), isDeleted())));
}
TEST(IsNoThrow, MatchesNoThrowFunctionDeclarations) {
EXPECT_TRUE(notMatches("void f();", functionDecl(isNoThrow())));
EXPECT_TRUE(notMatches("void f() throw(int);", functionDecl(isNoThrow())));
EXPECT_TRUE(
notMatches("void f() noexcept(false);", functionDecl(isNoThrow())));
EXPECT_TRUE(matches("void f() throw();", functionDecl(isNoThrow())));
EXPECT_TRUE(matches("void f() noexcept;", functionDecl(isNoThrow())));
}
TEST(isConstexpr, MatchesConstexprDeclarations) {
EXPECT_TRUE(matches("constexpr int foo = 42;",
varDecl(hasName("foo"), isConstexpr())));