================
@@ -655,6 +656,13 @@ void FactsGenerator::handleFunctionCall(const Expr *Call,
   // All arguments to a function are a use of the corresponding expressions.
   for (const Expr *Arg : Args)
     handleUse(Arg);
+
+  if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(Call);
+      OCE && OCE->getOperator() == OO_Call && FD->isStatic()) {
+    // Ignore first element
+    Args = Args.slice(1);
+  }
+
   handleInvalidatingCall(Call, FD, Args);
   handleMovedArgsInCall(FD, Args);
----------------
hokein wrote:

The crash occurs in the `handleMovedArgsInCall` method. Instead of shifting 
arguments at the caller level, I think it is better to fix the logic within 
`handleMovedArgsInCall` itself.

Looking at the current 
[implementation](https://github.com/llvm/llvm-project/blob/7c6996fc8fff8a24290b52b90ead246c7afdce65/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp#L595)
 of `handleMovedArgsInCall`, it only shifts the argument list (skipping the 
function object) if the method is non-static. While this is correct for 
standard methods, it does not account for a static `operator()`.

For a static `operator()`, the function object is still provided as the first 
argument, similar to a non-static operator. This is an intended design choice 
(see https://github.com/llvm/llvm-project/pull/68485). 

https://github.com/llvm/llvm-project/pull/187853
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to