================
@@ -1311,13 +1311,26 @@ void CIRGenFunction::emitCallArg(CallArgList &args,
const clang::Expr *e,
bool hasAggregateEvalKind = hasAggregateEvaluationKind(argType);
- // In the Microsoft C++ ABI, aggregate arguments are destructed by the
callee.
- // However, we still have to push an EH-only cleanup in case we unwind before
- // we make it to the call.
+ // For callee-destructed parameters (trivial_abi, MS ABI), create an
+ // aggregate temp and let the callee destroy it.
if (argType->isRecordType() &&
argType->castAsRecordDecl()->isParamDestroyedInCallee()) {
- assert(!cir::MissingFeatures::msabi());
- cgm.errorNYI(e->getSourceRange(), "emitCallArg: msabi is NYI");
+ AggValueSlot slot = createAggTemp(argType, getLoc(e->getSourceRange()),
+ getCounterAggTmpAsString());
+
+ bool destroyedInCallee = true;
+ if (const auto *rd = argType->getAsCXXRecordDecl())
+ destroyedInCallee = rd->hasNonTrivialDestructor();
+
+ if (destroyedInCallee)
+ slot.setExternallyDestructed();
+
+ emitAggExpr(e, slot);
+ RValue rv = slot.asRValue();
+ args.add(rv, argType);
+
+ assert(!cir::MissingFeatures::ehCleanupScope());
----------------
andykaylor wrote:
Can you make this a call to errorNYI if `getLangOpts().Exceptions` is set?
Since we have cleanup scopes implemented now, we really shouldn't be using this
as a missing feature.
I see that the test is being run with exceptions enabled. Is that necessary for
the minimal support you're adding here?
https://github.com/llvm/llvm-project/pull/191257
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits