forked from OSchip/llvm-project
[libTooling] Add support for implicit `this` to `buildAddressOf`.
Changes `buildAddressOf` to return `this` when given an implicit `this` expression. Differential Revision: https://reviews.llvm.org/D105551
This commit is contained in:
parent
f5603aa050
commit
d2e32fa493
|
@ -93,6 +93,8 @@ tooling::buildDereference(const Expr &E, const ASTContext &Context) {
|
|||
|
||||
llvm::Optional<std::string> tooling::buildAddressOf(const Expr &E,
|
||||
const ASTContext &Context) {
|
||||
if (E.isImplicitCXXThis())
|
||||
return std::string("this");
|
||||
if (const auto *Op = dyn_cast<UnaryOperator>(&E))
|
||||
if (Op->getOpcode() == UO_Deref) {
|
||||
// Strip leading '*'.
|
||||
|
|
|
@ -172,6 +172,24 @@ TEST(SourceCodeBuildersTest, BuildAddressOfBinaryOperation) {
|
|||
testBuilder(buildAddressOf, "S x; x + x;", "&(x + x)");
|
||||
}
|
||||
|
||||
TEST(SourceCodeBuildersTest, BuildAddressOfImplicitThis) {
|
||||
StringRef Snippet = R"cc(
|
||||
struct Struct {
|
||||
void foo() {}
|
||||
void bar() {
|
||||
foo();
|
||||
}
|
||||
};
|
||||
)cc";
|
||||
auto StmtMatch = matchStmt(
|
||||
Snippet,
|
||||
cxxMemberCallExpr(onImplicitObjectArgument(cxxThisExpr().bind("expr"))));
|
||||
ASSERT_TRUE(StmtMatch);
|
||||
EXPECT_THAT(buildAddressOf(*StmtMatch->Result.Nodes.getNodeAs<Expr>("expr"),
|
||||
*StmtMatch->Result.Context),
|
||||
ValueIs(std::string("this")));
|
||||
}
|
||||
|
||||
TEST(SourceCodeBuildersTest, BuildDereferencePointer) {
|
||||
testBuilder(buildDereference, "S *x; x;", "*x");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue