[clang] e7f55bb - [clang][Interp][NFCI] Call* ops don't modify the PC

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 7 23:50:54 PDT 2023


Author: Timm Bäder
Date: 2023-04-08T08:49:22+02:00
New Revision: e7f55bbdb880eb0c096b05d915ee920fe1f2fb98

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

LOG: [clang][Interp][NFCI] Call* ops don't modify the PC

This caused the reported errors from the Call*() handlers to report the
wrong source location.

Fixes: https://github.com/llvm/llvm-project/issues/62002

Added: 
    

Modified: 
    clang/lib/AST/Interp/Interp.h
    clang/lib/AST/Interp/Opcodes.td

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index afc5f24baf73..1eda38e9fa5b 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1486,28 +1486,29 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
   return NarrowPtr(S, OpPC);
 }
 
-inline bool CheckGlobalCtor(InterpState &S, CodePtr &PC) {
+inline bool CheckGlobalCtor(InterpState &S, CodePtr OpPC) {
   const Pointer &Obj = S.Stk.peek<Pointer>();
-  return CheckCtorCall(S, PC, Obj);
+  return CheckCtorCall(S, OpPC, Obj);
 }
 
-inline bool Call(InterpState &S, CodePtr &PC, const Function *Func) {
+inline bool Call(InterpState &S, CodePtr OpPC, const Function *Func) {
   if (Func->hasThisPointer()) {
     size_t ThisOffset =
         Func->getArgSize() + (Func->hasRVO() ? primSize(PT_Ptr) : 0);
+
     const Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset);
 
-    if (!CheckInvoke(S, PC, ThisPtr))
+    if (!CheckInvoke(S, OpPC, ThisPtr))
       return false;
 
     if (S.checkingPotentialConstantExpression())
       return false;
   }
 
-  if (!CheckCallable(S, PC, Func))
+  if (!CheckCallable(S, OpPC, Func))
     return false;
 
-  auto NewFrame = std::make_unique<InterpFrame>(S, Func, PC);
+  auto NewFrame = std::make_unique<InterpFrame>(S, Func, OpPC);
   InterpFrame *FrameBefore = S.Current;
   S.Current = NewFrame.get();
 
@@ -1541,14 +1542,14 @@ inline bool CallBI(InterpState &S, CodePtr &PC, const Function *Func) {
   return false;
 }
 
-inline bool CallPtr(InterpState &S, CodePtr &PC) {
+inline bool CallPtr(InterpState &S, CodePtr OpPC) {
   const FunctionPointer &FuncPtr = S.Stk.pop<FunctionPointer>();
 
   const Function *F = FuncPtr.getFunction();
   if (!F || !F->isConstexpr())
     return false;
 
-  return Call(S, PC, F);
+  return Call(S, OpPC, F);
 }
 
 inline bool GetFnPtr(InterpState &S, CodePtr &PC, const Function *Func) {

diff  --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td
index f3662dcd6f43..ed0774a78833 100644
--- a/clang/lib/AST/Interp/Opcodes.td
+++ b/clang/lib/AST/Interp/Opcodes.td
@@ -179,19 +179,16 @@ def NoRet : Opcode {}
 def Call : Opcode {
   let Args = [ArgFunction];
   let Types = [];
-  let ChangesPC = 1;
 }
 
 def CallBI : Opcode {
   let Args = [ArgFunction];
   let Types = [];
-  let ChangesPC = 1;
 }
 
 def CallPtr : Opcode {
   let Args = [];
   let Types = [];
-  let ChangesPC = 1;
 }
 
 //===----------------------------------------------------------------------===//


        


More information about the cfe-commits mailing list