[clang] d2e32fa - [libTooling] Add support for implicit `this` to `buildAddressOf`.

Yitzhak Mandelbaum via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 7 10:36:03 PDT 2021


Author: Yitzhak Mandelbaum
Date: 2021-07-07T17:35:04Z
New Revision: d2e32fa493a272c21dee2c6cbf52e501f9ee3908

URL: https://github.com/llvm/llvm-project/commit/d2e32fa493a272c21dee2c6cbf52e501f9ee3908
DIFF: https://github.com/llvm/llvm-project/commit/d2e32fa493a272c21dee2c6cbf52e501f9ee3908.diff

LOG: [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

Added: 
    

Modified: 
    clang/lib/Tooling/Transformer/SourceCodeBuilders.cpp
    clang/unittests/Tooling/SourceCodeBuildersTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Tooling/Transformer/SourceCodeBuilders.cpp b/clang/lib/Tooling/Transformer/SourceCodeBuilders.cpp
index 56ec45e8fd1dc..a1c99b60216b7 100644
--- a/clang/lib/Tooling/Transformer/SourceCodeBuilders.cpp
+++ b/clang/lib/Tooling/Transformer/SourceCodeBuilders.cpp
@@ -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 '*'.

diff  --git a/clang/unittests/Tooling/SourceCodeBuildersTest.cpp b/clang/unittests/Tooling/SourceCodeBuildersTest.cpp
index b6f6aba63e2f1..ce99d1e7f5217 100644
--- a/clang/unittests/Tooling/SourceCodeBuildersTest.cpp
+++ b/clang/unittests/Tooling/SourceCodeBuildersTest.cpp
@@ -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");
 }


        


More information about the cfe-commits mailing list