mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-04 08:16:49 +00:00
Add hasTrailingReturn AST matcher
Adds AST matcher for a FunctionDecl that has a trailing return type. Differential Revision: https://reviews.llvm.org/D42273 llvm-svn: 323158
This commit is contained in:
parent
55942abb92
commit
239d25a158
@ -2749,6 +2749,15 @@ Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOp
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
|
||||
|
||||
Example matches Y (matcher = functionDecl(hasTrailingReturn()))
|
||||
int X() {}
|
||||
auto Y() -> int {}
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></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.
|
||||
|
||||
|
@ -5893,6 +5893,19 @@ AST_MATCHER(EnumDecl, isScoped) {
|
||||
return Node.isScoped();
|
||||
}
|
||||
|
||||
/// \brief Matches a function declared with a trailing return type.
|
||||
///
|
||||
/// Example matches Y (matcher = functionDecl(hasTrailingReturn()))
|
||||
/// \code
|
||||
/// int X() {}
|
||||
/// auto Y() -> int {}
|
||||
/// \endcode
|
||||
AST_MATCHER(FunctionDecl, hasTrailingReturn) {
|
||||
if (const auto *F = Node.getType()->getAs<FunctionProtoType>())
|
||||
return F->hasTrailingReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace ast_matchers
|
||||
} // namespace clang
|
||||
|
||||
|
@ -296,6 +296,7 @@ RegistryMaps::RegistryMaps() {
|
||||
REGISTER_MATCHER(hasTemplateArgument);
|
||||
REGISTER_MATCHER(hasThen);
|
||||
REGISTER_MATCHER(hasThreadStorageDuration);
|
||||
REGISTER_MATCHER(hasTrailingReturn);
|
||||
REGISTER_MATCHER(hasTrueExpression);
|
||||
REGISTER_MATCHER(hasTypeLoc);
|
||||
REGISTER_MATCHER(hasUnaryOperand);
|
||||
|
@ -2112,5 +2112,24 @@ TEST(IsScopedEnum, MatchesScopedEnum) {
|
||||
EXPECT_TRUE(notMatches("enum X {};", enumDecl(isScoped())));
|
||||
}
|
||||
|
||||
TEST(HasTrailingReturn, MatchesTrailingReturn) {
|
||||
EXPECT_TRUE(matches("auto Y() -> int { return 0; }",
|
||||
functionDecl(hasTrailingReturn())));
|
||||
EXPECT_TRUE(matches("auto X() -> int;", functionDecl(hasTrailingReturn())));
|
||||
EXPECT_TRUE(notMatches("int X() { return 0; }",
|
||||
functionDecl(hasTrailingReturn())));
|
||||
EXPECT_TRUE(notMatches("int X();", functionDecl(hasTrailingReturn())));
|
||||
EXPECT_TRUE(notMatchesC("void X();", functionDecl(hasTrailingReturn())));
|
||||
}
|
||||
|
||||
TEST(HasTrailingReturn, MatchesLambdaTrailingReturn) {
|
||||
EXPECT_TRUE(matches(
|
||||
"auto lambda2 = [](double x, double y) -> double {return x + y;};",
|
||||
functionDecl(hasTrailingReturn())));
|
||||
EXPECT_TRUE(notMatches(
|
||||
"auto lambda2 = [](double x, double y) {return x + y;};",
|
||||
functionDecl(hasTrailingReturn())));
|
||||
}
|
||||
|
||||
} // namespace ast_matchers
|
||||
} // namespace clang
|
||||
|
Loading…
x
Reference in New Issue
Block a user