forked from OSchip/llvm-project
[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
This commit is contained in:
parent
f85a6a8127
commit
c34d898183
|
@ -4322,7 +4322,7 @@ varDecl(isExternC())
|
|||
|
||||
|
||||
<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 @@ Given
|
|||
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 @@ namespaceDecl(isAnonymous()) will match #1 but not ::n.
|
|||
|
||||
|
||||
<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 @@ Given
|
|||
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 @@ auto f = [x=3]() { return x; };
|
|||
</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.
|
||||
|
||||
|
|
|
@ -186,6 +186,8 @@ Build System Changes
|
|||
AST Matchers
|
||||
------------
|
||||
|
||||
- Expanded ``isInline`` narrowing matcher to support c++17 inline variables.
|
||||
|
||||
clang-format
|
||||
------------
|
||||
|
||||
|
|
|
@ -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 differs 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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue