@@ -1322,7 +1322,9 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
1322
1322
signature.visitParameterList (
1323
1323
[&](const LoweredFunctionSignature::IndirectResultValue &) {},
1324
1324
[&](const LoweredFunctionSignature::DirectParameter ¶m) {
1325
- if (isConsumedParameterInCaller (param.getConvention ()))
1325
+ if (isConsumedParameterInCaller (param.getConvention ()) &&
1326
+ !hasKnownOptionalNullableCxxMapping (
1327
+ param.getParamDecl ().getInterfaceType ()))
1326
1328
emitParamCopyForConsume (param.getParamDecl ());
1327
1329
++paramIndex;
1328
1330
},
@@ -1394,7 +1396,9 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
1394
1396
},
1395
1397
[&](const LoweredFunctionSignature::DirectParameter ¶m) {
1396
1398
printParamUse (param.getParamDecl (), /* isIndirect=*/ false ,
1397
- isConsumedParameterInCaller (param.getConvention ()),
1399
+ isConsumedParameterInCaller (param.getConvention ()) &&
1400
+ !hasKnownOptionalNullableCxxMapping (
1401
+ param.getParamDecl ().getInterfaceType ()),
1398
1402
encodeTypeInfo (param, moduleContext, typeMapping));
1399
1403
},
1400
1404
[&](const LoweredFunctionSignature::IndirectParameter ¶m) {
@@ -1756,11 +1760,13 @@ void DeclAndTypeClangFunctionPrinter::printCxxSubscriptAccessorMethod(
1756
1760
bool DeclAndTypeClangFunctionPrinter::hasKnownOptionalNullableCxxMapping (
1757
1761
Type type) {
1758
1762
if (auto optionalObjectType = type->getOptionalObjectType ()) {
1759
- if (optionalObjectType->getNominalOrBoundGenericNominal ()) {
1763
+ if (const auto *nominal =
1764
+ optionalObjectType->getNominalOrBoundGenericNominal ()) {
1760
1765
if (auto typeInfo = typeMapping.getKnownCxxTypeInfo (
1761
1766
optionalObjectType->getNominalOrBoundGenericNominal ())) {
1762
1767
return typeInfo->canBeNullable ;
1763
1768
}
1769
+ return isa_and_nonnull<clang::ObjCInterfaceDecl>(nominal->getClangDecl ());
1764
1770
}
1765
1771
}
1766
1772
return false ;
0 commit comments