Index: cfe/trunk/docs/LibASTMatchersReference.html =================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html +++ cfe/trunk/docs/LibASTMatchersReference.html @@ -1966,6 +1966,31 @@ +
Matches a variable declaration that does not have local storage. + +Example matches y and z (matcher = varDecl(hasGlobalStorage()) +void f() { + int x; + static int y; +} +int z; +
Matches a variable declaration that has function scope and is a +non-static local variable. + +Example matches x (matcher = varDecl(hasLocalStorage()) +void f() { + int x; + static int y; +} +int z; +
Matches if a declaration has a body attached. Index: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h @@ -2058,6 +2058,35 @@ InnerMatcher.matches(*Initializer, Finder, Builder)); } +/// \brief Matches a variable declaration that has function scope and is a +/// non-static local variable. +/// +/// Example matches x (matcher = varDecl(hasLocalStorage()) +/// \code +/// void f() { +/// int x; +/// static int y; +/// } +/// int z; +/// \endcode +AST_MATCHER(VarDecl, hasLocalStorage) { + return Node.hasLocalStorage(); +} + +/// \brief Matches a variable declaration that does not have local storage. +/// +/// Example matches y and z (matcher = varDecl(hasGlobalStorage()) +/// \code +/// void f() { +/// int x; +/// static int y; +/// } +/// int z; +/// \endcode +AST_MATCHER(VarDecl, hasGlobalStorage) { + return Node.hasGlobalStorage(); +} + /// \brief Checks that a call expression or a constructor call expression has /// a specific number of arguments (including absent default arguments). /// Index: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp @@ -189,12 +189,14 @@ REGISTER_MATCHER(hasEitherOperand); REGISTER_MATCHER(hasElementType); REGISTER_MATCHER(hasFalseExpression); + REGISTER_MATCHER(hasGlobalStorage); REGISTER_MATCHER(hasImplicitDestinationType); REGISTER_MATCHER(hasIncrement); REGISTER_MATCHER(hasIndex); REGISTER_MATCHER(hasInitializer); REGISTER_MATCHER(hasLHS); REGISTER_MATCHER(hasLocalQualifiers); + REGISTER_MATCHER(hasLocalStorage); REGISTER_MATCHER(hasLoopInit); REGISTER_MATCHER(hasMethod); REGISTER_MATCHER(hasName); Index: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp =================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp @@ -1165,6 +1165,18 @@ "}", Reference)); } +TEST(Matcher, VarDecl_Storage) { + auto M = varDecl(hasName("X"), hasLocalStorage()); + EXPECT_TRUE(matches("void f() { int X; }", M)); + EXPECT_TRUE(notMatches("int X;", M)); + EXPECT_TRUE(notMatches("void f() { static int X; }", M)); + + M = varDecl(hasName("X"), hasGlobalStorage()); + EXPECT_TRUE(notMatches("void f() { int X; }", M)); + EXPECT_TRUE(matches("int X;", M)); + EXPECT_TRUE(matches("void f() { static int X; }", M)); +} + TEST(Matcher, FindsVarDeclInFunctionParameter) { EXPECT_TRUE(matches( "void f(int i) {}",