[clang] 7b6447a - [clang][Interp] Fix calling lambdas with explicit instance pointers...

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 14 22:36:52 PDT 2024


Author: Timm Bäder
Date: 2024-06-15T07:36:43+02:00
New Revision: 7b6447a1574a1b852dfd8bff57ad4c48548c0102

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

LOG: [clang][Interp] Fix calling lambdas with explicit instance pointers...

...via a function pointer.

Added: 
    

Modified: 
    clang/lib/AST/Interp/Function.h
    clang/lib/AST/Interp/Interp.h
    clang/test/AST/Interp/lambda.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Function.h b/clang/lib/AST/Interp/Function.h
index 0be4564e1e9ec..92bcd96927912 100644
--- a/clang/lib/AST/Interp/Function.h
+++ b/clang/lib/AST/Interp/Function.h
@@ -196,6 +196,12 @@ class Function final {
     return ArgSize - (align(primSize(PT_Ptr)) * (hasThisPointer() + hasRVO()));
   }
 
+  bool isThisPointerExplicit() const {
+    if (const auto *MD = dyn_cast<CXXMethodDecl>(F))
+      return MD->isExplicitObjectMemberFunction();
+    return false;
+  }
+
   unsigned getParamOffset(unsigned ParamIndex) const {
     return ParamOffsets[ParamIndex];
   }

diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index 784e138e1467d..1ce92798150c5 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -2442,6 +2442,11 @@ inline bool CallPtr(InterpState &S, CodePtr OpPC, uint32_t ArgSize,
   assert(ArgSize >= F->getWrittenArgSize());
   uint32_t VarArgSize = ArgSize - F->getWrittenArgSize();
 
+  // We need to do this explicitly here since we don't have the necessary
+  // information to do it automatically.
+  if (F->isThisPointerExplicit())
+    VarArgSize -= align(primSize(PT_Ptr));
+
   if (F->isVirtual())
     return CallVirt(S, OpPC, F, VarArgSize);
 

diff  --git a/clang/test/AST/Interp/lambda.cpp b/clang/test/AST/Interp/lambda.cpp
index 0eb12643b1b7f..c4fce283ec45a 100644
--- a/clang/test/AST/Interp/lambda.cpp
+++ b/clang/test/AST/Interp/lambda.cpp
@@ -280,3 +280,14 @@ namespace InvalidCapture {
     } ();
   }
 }
+
+namespace ExplicitInstancePointer {
+  struct C {
+      constexpr C(auto) { }
+  };
+  void foo() {
+      constexpr auto b = [](this C) { return 1; };
+      constexpr int (*fp)(C) = b;
+      static_assert(fp(1) == 1, "");
+  }
+}


        


More information about the cfe-commits mailing list