Author: Nathan James Date: 2022-02-23T08:34:00Z New Revision: c34d89818341b3c7c96bc8f59e3f98063d4ae9fd
URL: https://github.com/llvm/llvm-project/commit/c34d89818341b3c7c96bc8f59e3f98063d4ae9fd DIFF: https://github.com/llvm/llvm-project/commit/c34d89818341b3c7c96bc8f59e3f98063d4ae9fd.diff LOG: [ASTMatchers] Expand isInline matcher to VarDecl Add support to the `isInline` matcher for C++17's inline variables. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D118900 Added: Modified: clang/docs/LibASTMatchersReference.html clang/docs/ReleaseNotes.rst clang/include/clang/ASTMatchers/ASTMatchers.h clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp Removed: ################################################################################ diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index a3f57996a6fb2..d552f4ccd7668 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -4322,7 +4322,7 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> -<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with +<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches functions, variables and namespace declarations that are marked with the inline keyword. Given @@ -4331,8 +4331,10 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> namespace n { inline namespace m {} } + inline int Foo = 5; functionDecl(isInline()) will match ::f(). namespaceDecl(isInline()) will match n::m. +varDecl(isInline()) will match Foo; </pre></td></tr> @@ -4697,7 +4699,7 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> -<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with +<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches functions, variables and namespace declarations that are marked with the inline keyword. Given @@ -4706,8 +4708,10 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> namespace n { inline namespace m {} } + inline int Foo = 5; functionDecl(isInline()) will match ::f(). namespaceDecl(isInline()) will match n::m. +varDecl(isInline()) will match Foo; </pre></td></tr> @@ -5728,6 +5732,23 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isInline2')"><a name="isInline2Anchor">isInline</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isInline2"><pre>Matches functions, variables and namespace declarations that are marked with +the inline keyword. + +Given + inline void f(); + void g(); + namespace n { + inline namespace m {} + } + inline int Foo = 5; +functionDecl(isInline()) will match ::f(). +namespaceDecl(isInline()) will match n::m. +varDecl(isInline()) will match Foo; +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></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. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 68a867409c160..4131c022f5944 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -186,6 +186,8 @@ Build System Changes AST Matchers ------------ +- Expanded ``isInline`` narrowing matcher to support c++17 inline variables. + clang-format ------------ diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 86bd44091b593..6664a5bcfe7fb 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -7673,7 +7673,7 @@ AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>, return InnerMatcher.matches(*ES.getExpr(), Finder, Builder); } -/// Matches function and namespace declarations that are marked with +/// Matches functions, variables and namespace declarations that are marked with /// the inline keyword. /// /// Given @@ -7683,18 +7683,22 @@ AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>, /// namespace n { /// inline namespace m {} /// } +/// inline int Foo = 5; /// \endcode /// functionDecl(isInline()) will match ::f(). /// namespaceDecl(isInline()) will match n::m. -AST_POLYMORPHIC_MATCHER(isInline, - AST_POLYMORPHIC_SUPPORTED_TYPES(NamespaceDecl, - FunctionDecl)) { +/// varDecl(isInline()) will match Foo; +AST_POLYMORPHIC_MATCHER(isInline, AST_POLYMORPHIC_SUPPORTED_TYPES(NamespaceDecl, + FunctionDecl, + VarDecl)) { // This is required because the spelling of the function used to determine // whether inline is specified or not diff ers between the polymorphic types. if (const auto *FD = dyn_cast<FunctionDecl>(&Node)) return FD->isInlineSpecified(); - else if (const auto *NSD = dyn_cast<NamespaceDecl>(&Node)) + if (const auto *NSD = dyn_cast<NamespaceDecl>(&Node)) return NSD->isInline(); + if (const auto *VD = dyn_cast<VarDecl>(&Node)) + return VD->isInline(); llvm_unreachable("Not a valid polymorphic type"); } diff --git a/clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp index 6fec0d2e73694..2766065f9e5d1 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp @@ -197,6 +197,8 @@ TEST(IsInlineMatcher, IsInline) { functionDecl(isInline(), hasName("f")))); EXPECT_TRUE(matches("namespace n { inline namespace m {} }", namespaceDecl(isInline(), hasName("m")))); + EXPECT_TRUE(matches("inline int Foo = 5;", + varDecl(isInline(), hasName("Foo")), {Lang_CXX17})); } // FIXME: Figure out how to specify paths so the following tests pass on _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits