Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -2611,12 +2611,14 @@
Matches variablefunction declarations that have static storage class -(with "static" key word) written in the source. + Matches variablefunction declarations that have "static" storage +class specifier ("static" key word) written in the source. Given: static void f() {} static int i = 0; + extern int j; + int k; functionDecl(isStaticStorageClass()) matches the function declaration f. varDecl(isStaticStorageClass()) @@ -3394,15 +3396,19 @@Matcher<VarDecl> hasStaticStorageDuration @@ -3488,12 +3494,14 @@ Matches a variable declaration that has static storage duration. +It includes the variable declared at namespace scope and those declared +with "static" and "extern" storage class specifiers. -Example matches y and a, but not x or z. -(matcher = varDecl(hasStaticStorageDuration()) void f() { int x; static int y; thread_local int z; } int a; +static int b; +extern int c; +varDecl(isStaticStorageClass()) + matches the function declaration y, a, b and c.- Matcher<VarDecl> isStaticStorageClass Matches variablefunction declarations that have static storage class -(with "static" key word) written in the source. + Matches variablefunction declarations that have "static" storage +class specifier ("static" key word) written in the source. Given: static void f() {} static int i = 0; + extern int j; + int k; functionDecl(isStaticStorageClass()) matches the function declaration f. varDecl(isStaticStorageClass()) Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -2942,9 +2942,9 @@ } /// \brief Matches a variable declaration that has static storage duration. +/// It includes the variable declared at namespace scope and those declared +/// with "static" and "extern" storage class specifiers. /// -/// Example matches y and a, but not x or z. -/// (matcher = varDecl(hasStaticStorageDuration()) /// \code /// void f() { /// int x; @@ -2952,6 +2952,10 @@ /// thread_local int z; /// } /// int a; +/// static int b; +/// extern int c; +/// varDecl(isStaticStorageClass()) +/// matches the function declaration y, a, b and c. /// \endcode AST_MATCHER(VarDecl, hasStaticStorageDuration) { return Node.getStorageDuration() == SD_Static; @@ -3387,13 +3391,15 @@ return Node.isExternC(); } -/// \brief Matches variable/function declarations that have static storage class -/// (with "static" key word) written in the source. +/// \brief Matches variable/function declarations that have "static" storage +/// class specifier ("static" key word) written in the source. /// /// Given: /// \code /// static void f() {} /// static int i = 0; +/// extern int j; +/// int k; /// \endcode /// functionDecl(isStaticStorageClass()) /// matches the function declaration f. Index: unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -669,7 +669,7 @@ TEST(Matcher, VarDecl_StorageDuration) { std::string T = - "void f() { int x; static int y; } int a;"; + "void f() { int x; static int y; } int a;static int b;extern int c;"; EXPECT_TRUE(matches(T, varDecl(hasName("x"), hasAutomaticStorageDuration()))); EXPECT_TRUE( @@ -679,6 +679,8 @@ EXPECT_TRUE(matches(T, varDecl(hasName("y"), hasStaticStorageDuration()))); EXPECT_TRUE(matches(T, varDecl(hasName("a"), hasStaticStorageDuration()))); + EXPECT_TRUE(matches(T, varDecl(hasName("b"), hasStaticStorageDuration()))); + EXPECT_TRUE(matches(T, varDecl(hasName("c"), hasStaticStorageDuration()))); EXPECT_TRUE(notMatches(T, varDecl(hasName("x"), hasStaticStorageDuration()))); // FIXME: It is really hard to test with thread_local itself because not all @@ -853,6 +855,7 @@ matches("static void f() {}", functionDecl(isStaticStorageClass()))); EXPECT_TRUE(matches("static int i = 1;", varDecl(isStaticStorageClass()))); EXPECT_TRUE(notMatches("int i = 1;", varDecl(isStaticStorageClass()))); + EXPECT_TRUE(notMatches("extern int i;", varDecl(isStaticStorageClass()))); EXPECT_TRUE(notMatches("void f() {}", functionDecl(isStaticStorageClass()))); }