зеркало из https://github.com/microsoft/clang.git
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:
Родитель
c6a102dd24
Коммит
b5478a7e86
|
@ -2236,6 +2236,20 @@ namespaceDecl(isInline()) will match n::m.
|
|||
</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.
|
||||
|
||||
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<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></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())));
|
||||
|
|
Загрузка…
Ссылка в новой задаче