@@ -1322,7 +1322,9 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
13221322 signature.visitParameterList (
13231323 [&](const LoweredFunctionSignature::IndirectResultValue &) {},
13241324 [&](const LoweredFunctionSignature::DirectParameter ¶m) {
1325- if (isConsumedParameterInCaller (param.getConvention ()))
1325+ if (isConsumedParameterInCaller (param.getConvention ()) &&
1326+ !hasKnownOptionalNullableCxxMapping (
1327+ param.getParamDecl ().getInterfaceType ()))
13261328 emitParamCopyForConsume (param.getParamDecl ());
13271329 ++paramIndex;
13281330 },
@@ -1394,7 +1396,9 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
13941396 },
13951397 [&](const LoweredFunctionSignature::DirectParameter ¶m) {
13961398 printParamUse (param.getParamDecl (), /* isIndirect=*/ false ,
1397- isConsumedParameterInCaller (param.getConvention ()),
1399+ isConsumedParameterInCaller (param.getConvention ()) &&
1400+ !hasKnownOptionalNullableCxxMapping (
1401+ param.getParamDecl ().getInterfaceType ()),
13981402 encodeTypeInfo (param, moduleContext, typeMapping));
13991403 },
14001404 [&](const LoweredFunctionSignature::IndirectParameter ¶m) {
@@ -1756,11 +1760,13 @@ void DeclAndTypeClangFunctionPrinter::printCxxSubscriptAccessorMethod(
17561760bool DeclAndTypeClangFunctionPrinter::hasKnownOptionalNullableCxxMapping (
17571761 Type type) {
17581762 if (auto optionalObjectType = type->getOptionalObjectType ()) {
1759- if (optionalObjectType->getNominalOrBoundGenericNominal ()) {
1763+ if (const auto *nominal =
1764+ optionalObjectType->getNominalOrBoundGenericNominal ()) {
17601765 if (auto typeInfo = typeMapping.getKnownCxxTypeInfo (
17611766 optionalObjectType->getNominalOrBoundGenericNominal ())) {
17621767 return typeInfo->canBeNullable ;
17631768 }
1769+ return isa_and_nonnull<clang::ObjCInterfaceDecl>(nominal->getClangDecl ());
17641770 }
17651771 }
17661772 return false ;
0 commit comments