From 12b3804145dd455f10efdcbe1bd159232266f905 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein@google.com> Date: Tue, 27 Sep 2016 07:53:20 +0000 Subject: [PATCH] [ASTMatcher] Clarify isStaticStorageClass and hasStaticStorageDuration documents. Reviewers: aaron.ballman Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D24928 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@282474 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LibASTMatchersReference.html | 20 +++++++++++++------ include/clang/ASTMatchers/ASTMatchers.h | 14 +++++++++---- .../ASTMatchers/ASTMatchersNarrowingTest.cpp | 5 ++++- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/docs/LibASTMatchersReference.html b/docs/LibASTMatchersReference.html index 2c01bfa7a44..be7df593b25 100644 --- a/docs/LibASTMatchersReference.html +++ b/docs/LibASTMatchersReference.html @@ -2611,12 +2611,14 @@ functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> -<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have static storage class -(with "static" key word) written in the source. +<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage +class specifier ("static" keyword) 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 @@ int z; <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>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(hasStaticStorageDuration()) + matches the function declaration y, a, b and c. </pre></td></tr> @@ -3488,12 +3494,14 @@ functionDecl(isExternC()) <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></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 -(with "static" key word) written in the source. +<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage +class specifier ("static" keyword) 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()) diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h index af4cd47d532..3c001c554ef 100644 --- a/include/clang/ASTMatchers/ASTMatchers.h +++ b/include/clang/ASTMatchers/ASTMatchers.h @@ -2943,9 +2943,9 @@ AST_MATCHER(VarDecl, hasAutomaticStorageDuration) { } /// \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; @@ -2953,6 +2953,10 @@ AST_MATCHER(VarDecl, hasAutomaticStorageDuration) { /// thread_local int z; /// } /// int a; +/// static int b; +/// extern int c; +/// varDecl(hasStaticStorageDuration()) +/// matches the function declaration y, a, b and c. /// \endcode AST_MATCHER(VarDecl, hasStaticStorageDuration) { return Node.getStorageDuration() == SD_Static; @@ -3388,13 +3392,15 @@ AST_POLYMORPHIC_MATCHER(isExternC, AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, 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" keyword) 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. diff --git a/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index 5834211bdb0..b7ffd75384f 100644 --- a/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -669,7 +669,7 @@ TEST(Matcher, VarDecl_Storage) { 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 @@ TEST(Matcher, VarDecl_StorageDuration) { 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 @@ TEST(IsStaticStorageClass, MatchesStaticDeclarations) { 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()))); } -- GitLab