================
@@ -5865,10 +5867,24 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType,
const CGCallee &OrigCallee
break;
}
}
+
+ if (const auto *MD =
+ dyn_cast_if_present<CXXMethodDecl>(OCE->getCalleeDecl());
+ MD && MD->isStatic())
+ StaticOperator = true;
}
- EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), E->arguments(),
- E->getDirectCallee(), /*ParamsToSkip*/ 0, Order);
+ if (StaticOperator) {
+ // If we're calling a static operator, we need to emit the object argument
+ // and ignore it.
+ EmitIgnoredExpr(E->getArg(0));
+
+ EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType),
+ drop_begin(E->arguments(), 1), E->getDirectCallee(),
+ /*ParamsToSkip=*/0, Order);
+ } else
+ EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), E->arguments(),
+ E->getDirectCallee(), /*ParamsToSkip=*/0, Order);
----------------
SuperSodaSea wrote:
I tried to use `ParamsToSkip` before, and got assertion error for type mismatch
in test **cxx2b-static-call-operator.cpp** &
**cxx2b-static-subscript-operator.cpp**:
```
# | Assertion failed: (isGenericMethod || Ty->isVariablyModifiedType() ||
Ty.getNonReferenceType()->isObjCRetainableType() || getContext()
.getCanonicalType(Ty.getNonReferenceType()) .getTypePtr() ==
getContext().getCanonicalType((*Arg)->getType()).getTypePtr()) && "type
mismatch in call argument!", file
.../llvm-project/clang/lib/CodeGen/CGCall.cpp, line 4470
```
https://github.com/llvm/llvm-project/blob/22be6a2c66fceead40cf7561806bdaf424cd3c71/clang/lib/CodeGen/CGCall.cpp#L4463-L4470
So I have to use `drop_begin` instead.
https://github.com/llvm/llvm-project/pull/68485
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits