diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -4322,7 +4322,7 @@
Matches function and namespace declarations that are marked with +@@ -4697,7 +4699,7 @@ Matches functions, variables and namespace declarations that are marked with the inline keyword. Given @@ -4331,8 +4331,10 @@ 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;- Matcher<NamespaceDecl> isInline + Matches function and namespace declarations that are marked with +@@ -5728,6 +5732,23 @@ Matches functions, variables and namespace declarations that are marked with the inline keyword. Given @@ -4706,8 +4708,10 @@ 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;+ Matcher<VarDecl> isInline + + 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; +Matcher<VarDecl> isStaticLocal Matches a static variable with local scope. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -186,6 +186,8 @@ 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 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -7673,7 +7673,7 @@ 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 @@ /// 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 differs between the polymorphic types. if (const auto *FD = dyn_cast(&Node)) return FD->isInlineSpecified(); - else if (const auto *NSD = dyn_cast (&Node)) + if (const auto *NSD = dyn_cast (&Node)) return NSD->isInline(); + if (const auto *VD = dyn_cast (&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 --- a/clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersInternalTest.cpp @@ -197,6 +197,8 @@ 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