[ASTMatchers] Overload isConstexpr for ifStmts

Differential Revision: https://reviews.llvm.org/D46233

llvm-svn: 331759
This commit is contained in:
Gabor Horvath 2018-05-08 11:53:32 +00:00
parent d8e76494fc
commit 3cd0aa3b7e
3 changed files with 38 additions and 4 deletions

View File

@ -2789,15 +2789,19 @@ auto Y() -> int {}
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> <tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
and if constexpr.
Given: Given:
constexpr int foo = 42; constexpr int foo = 42;
constexpr int bar(); constexpr int bar();
void baz() { if constexpr(1 &gt; 0) {} }
varDecl(isConstexpr()) varDecl(isConstexpr())
matches the declaration of foo. matches the declaration of foo.
functionDecl(isConstexpr()) functionDecl(isConstexpr())
matches the declaration of bar. matches the declaration of bar.
ifStmt(isConstexpr())
matches the if statement in baz.
</pre></td></tr> </pre></td></tr>
@ -3039,6 +3043,23 @@ functionProtoType(parameterCountIs(3))
</pre></td></tr> </pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
and if constexpr.
Given:
constexpr int foo = 42;
constexpr int bar();
void baz() { if constexpr(1 &gt; 0) {} }
varDecl(isConstexpr())
matches the declaration of foo.
functionDecl(isConstexpr())
matches the declaration of bar.
ifStmt(isConstexpr())
matches the if statement in baz.
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> <tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
@ -3803,15 +3824,19 @@ int a;
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> <tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
and if constexpr.
Given: Given:
constexpr int foo = 42; constexpr int foo = 42;
constexpr int bar(); constexpr int bar();
void baz() { if constexpr(1 &gt; 0) {} }
varDecl(isConstexpr()) varDecl(isConstexpr())
matches the declaration of foo. matches the declaration of foo.
functionDecl(isConstexpr()) functionDecl(isConstexpr())
matches the declaration of bar. matches the declaration of bar.
ifStmt(isConstexpr())
matches the if statement in baz.
</pre></td></tr> </pre></td></tr>

View File

@ -3763,20 +3763,25 @@ AST_POLYMORPHIC_MATCHER(isNoThrow,
return FnTy->isNothrow(); return FnTy->isNothrow();
} }
/// \brief Matches constexpr variable and function declarations. /// \brief Matches constexpr variable and function declarations,
/// and if constexpr.
/// ///
/// Given: /// Given:
/// \code /// \code
/// constexpr int foo = 42; /// constexpr int foo = 42;
/// constexpr int bar(); /// constexpr int bar();
/// void baz() { if constexpr(1 > 0) {} }
/// \endcode /// \endcode
/// varDecl(isConstexpr()) /// varDecl(isConstexpr())
/// matches the declaration of foo. /// matches the declaration of foo.
/// functionDecl(isConstexpr()) /// functionDecl(isConstexpr())
/// matches the declaration of bar. /// matches the declaration of bar.
/// ifStmt(isConstexpr())
/// matches the if statement in baz.
AST_POLYMORPHIC_MATCHER(isConstexpr, AST_POLYMORPHIC_MATCHER(isConstexpr,
AST_POLYMORPHIC_SUPPORTED_TYPES(VarDecl, AST_POLYMORPHIC_SUPPORTED_TYPES(VarDecl,
FunctionDecl)) { FunctionDecl,
IfStmt)) {
return Node.isConstexpr(); return Node.isConstexpr();
} }

View File

@ -894,6 +894,10 @@ TEST(isConstexpr, MatchesConstexprDeclarations) {
varDecl(hasName("foo"), isConstexpr()))); varDecl(hasName("foo"), isConstexpr())));
EXPECT_TRUE(matches("constexpr int bar();", EXPECT_TRUE(matches("constexpr int bar();",
functionDecl(hasName("bar"), isConstexpr()))); functionDecl(hasName("bar"), isConstexpr())));
EXPECT_TRUE(matchesConditionally("void baz() { if constexpr(1 > 0) {} }",
ifStmt(isConstexpr()), true, "-std=c++17"));
EXPECT_TRUE(matchesConditionally("void baz() { if (1 > 0) {} }",
ifStmt(isConstexpr()), false, "-std=c++17"));
} }
TEST(TemplateArgumentCountIs, Matches) { TEST(TemplateArgumentCountIs, Matches) {