forked from OSchip/llvm-project
Add an AST matcher for external formal linkage.
Patch by Visoiu Mistrih llvm-svn: 278926
This commit is contained in:
parent
8e8e5061b8
commit
a086b9fd15
|
@ -2740,6 +2740,26 @@ memberExpr(isArrow())
|
|||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
|
||||
|
||||
Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
|
||||
void f() {
|
||||
int x;
|
||||
static int y;
|
||||
}
|
||||
int z;
|
||||
|
||||
Example matches f() because it has external formal linkage despite being
|
||||
unique to the translation unit as though it has internal likage
|
||||
(matcher = functionDecl(hasExternalFormalLinkage()))
|
||||
|
||||
namespace {
|
||||
void f() {}
|
||||
}
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
|
||||
|
||||
|
|
|
@ -5476,6 +5476,30 @@ AST_MATCHER_P(Stmt, forFunction, internal::Matcher<FunctionDecl>,
|
|||
return false;
|
||||
}
|
||||
|
||||
/// \brief Matches a declaration that has external formal linkage.
|
||||
///
|
||||
/// Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
|
||||
/// \code
|
||||
/// void f() {
|
||||
/// int x;
|
||||
/// static int y;
|
||||
/// }
|
||||
/// int z;
|
||||
/// \endcode
|
||||
///
|
||||
/// Example matches f() because it has external formal linkage despite being
|
||||
/// unique to the translation unit as though it has internal likage
|
||||
/// (matcher = functionDecl(hasExternalFormalLinkage()))
|
||||
///
|
||||
/// \code
|
||||
/// namespace {
|
||||
/// void f() {}
|
||||
/// }
|
||||
/// \endcode
|
||||
AST_MATCHER(NamedDecl, hasExternalFormalLinkage) {
|
||||
return Node.hasExternalFormalLinkage();
|
||||
}
|
||||
|
||||
} // end namespace ast_matchers
|
||||
} // end namespace clang
|
||||
|
||||
|
|
|
@ -226,6 +226,7 @@ RegistryMaps::RegistryMaps() {
|
|||
REGISTER_MATCHER(hasEitherOperand);
|
||||
REGISTER_MATCHER(hasElementType);
|
||||
REGISTER_MATCHER(hasElse);
|
||||
REGISTER_MATCHER(hasExternalFormalLinkage);
|
||||
REGISTER_MATCHER(hasFalseExpression);
|
||||
REGISTER_MATCHER(hasGlobalStorage);
|
||||
REGISTER_MATCHER(hasImplicitDestinationType);
|
||||
|
|
|
@ -1937,5 +1937,21 @@ TEST(NullPointerConstants, Basic) {
|
|||
EXPECT_TRUE(notMatches("int i = 0;", expr(nullPointerConstant())));
|
||||
}
|
||||
|
||||
TEST(HasExternalFormalLinkage, Basic) {
|
||||
EXPECT_TRUE(matches("int a = 0;", namedDecl(hasExternalFormalLinkage())));
|
||||
EXPECT_TRUE(
|
||||
notMatches("static int a = 0;", namedDecl(hasExternalFormalLinkage())));
|
||||
EXPECT_TRUE(notMatches("static void f(void) { int a = 0; }",
|
||||
namedDecl(hasExternalFormalLinkage())));
|
||||
EXPECT_TRUE(matches("void f(void) { int a = 0; }",
|
||||
namedDecl(hasExternalFormalLinkage())));
|
||||
|
||||
// Despite having internal semantic linkage, the anonymous namespace member
|
||||
// has external linkage because the member has a unique name in all
|
||||
// translation units.
|
||||
EXPECT_TRUE(matches("namespace { int a = 0; }",
|
||||
namedDecl(hasExternalFormalLinkage())));
|
||||
}
|
||||
|
||||
} // namespace ast_matchers
|
||||
} // namespace clang
|
||||
|
|
Loading…
Reference in New Issue