Add the isStaticLocal() AST matcher for matching on local static variables.

Patch by Joe Ranieri.

llvm-svn: 345502
This commit is contained in:
Aaron Ballman 2018-10-29 13:47:56 +00:00
parent bb1bd9ed79
commit 31f48c50cd
4 changed files with 35 additions and 0 deletions

View File

@ -4123,6 +4123,18 @@ varDecl(isExternC())
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
Example matches y (matcher = varDecl(isStaticLocal()))
void f() {
int x;
static int y;
}
static int z;
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
class specifier ("static" keyword) written in the source.

View File

@ -3300,6 +3300,20 @@ AST_MATCHER_P(
InnerMatcher.matches(*Initializer, Finder, Builder));
}
/// \brief Matches a static variable with local scope.
///
/// Example matches y (matcher = varDecl(isStaticLocal()))
/// \code
/// void f() {
/// int x;
/// static int y;
/// }
/// static int z;
/// \endcode
AST_MATCHER(VarDecl, isStaticLocal) {
return Node.isStaticLocal();
}
/// Matches a variable declaration that has function scope and is a
/// non-static local variable.
///

View File

@ -378,6 +378,7 @@ RegistryMaps::RegistryMaps() {
REGISTER_MATCHER(isPure);
REGISTER_MATCHER(isScoped);
REGISTER_MATCHER(isSignedInteger);
REGISTER_MATCHER(isStaticLocal);
REGISTER_MATCHER(isStaticStorageClass);
REGISTER_MATCHER(isStruct);
REGISTER_MATCHER(isTemplateInstantiation);

View File

@ -667,6 +667,14 @@ TEST(Matcher, VarDecl_Storage) {
EXPECT_TRUE(matches("void f() { static int X; }", M));
}
TEST(Matcher, VarDecl_IsStaticLocal) {
auto M = varDecl(isStaticLocal());
EXPECT_TRUE(matches("void f() { static int X; }", M));
EXPECT_TRUE(notMatches("static int X;", M));
EXPECT_TRUE(notMatches("void f() { int X; }", M));
EXPECT_TRUE(notMatches("int X;", M));
}
TEST(Matcher, VarDecl_StorageDuration) {
std::string T =
"void f() { int x; static int y; } int a;static int b;extern int c;";