@@ -1424,22 +1424,7 @@ void SignatureExpansion::expandExternalSignatureTypes() {
14241424 attrKindForExtending (signExt));
14251425 }
14261426
1427- // If we return indirectly, that is the first parameter type.
1428- if (returnInfo.isIndirect ()) {
1429- addIndirectResult ();
1430- }
1431-
1432- size_t firstParamToLowerNormally = 0 ;
1433-
1434- // Use a special IR type for passing block pointers.
1435- if (FnType->getRepresentation () == SILFunctionTypeRepresentation::Block) {
1436- assert (FI.arg_begin ()[0 ].info .isDirect () &&
1437- " block pointer not passed directly?" );
1438- ParamIRTypes.push_back (IGM.ObjCBlockPtrTy );
1439- firstParamToLowerNormally = 1 ;
1440- }
1441-
1442- for (auto i : indices (paramTys).slice (firstParamToLowerNormally)) {
1427+ auto emitArg = [&](size_t i) {
14431428 auto &AI = FI.arg_begin ()[i].info ;
14441429
14451430 // Add a padding argument if required.
@@ -1528,8 +1513,35 @@ void SignatureExpansion::expandExternalSignatureTypes() {
15281513 case clang::CodeGen::ABIArgInfo::InAlloca:
15291514 llvm_unreachable (" Need to handle InAlloca during signature expansion" );
15301515 }
1516+ };
1517+
1518+ size_t firstParamToLowerNormally = 0 ;
1519+
1520+ // If we return indirectly, that is the first parameter type.
1521+ if (returnInfo.isIndirect ()) {
1522+ if (IGM.Triple .isWindowsMSVCEnvironment () &&
1523+ FnType->getRepresentation () ==
1524+ SILFunctionTypeRepresentation::CXXMethod) {
1525+ // Windows ABI places `this` before the
1526+ // returned indirect values.
1527+ emitArg (0 );
1528+ firstParamToLowerNormally = 1 ;
1529+ addIndirectResult ();
1530+ } else
1531+ addIndirectResult ();
15311532 }
15321533
1534+ // Use a special IR type for passing block pointers.
1535+ if (FnType->getRepresentation () == SILFunctionTypeRepresentation::Block) {
1536+ assert (FI.arg_begin ()[0 ].info .isDirect () &&
1537+ " block pointer not passed directly?" );
1538+ ParamIRTypes.push_back (IGM.ObjCBlockPtrTy );
1539+ firstParamToLowerNormally = 1 ;
1540+ }
1541+
1542+ for (auto i : indices (paramTys).slice (firstParamToLowerNormally))
1543+ emitArg (i);
1544+
15331545 if (returnInfo.isIndirect () || returnInfo.isIgnore ()) {
15341546 ResultIRType = IGM.VoidTy ;
15351547 } else {
0 commit comments