@@ -212,6 +212,13 @@ class SILFunctionConventions {
212212 if (silConv.loweredAddresses )
213213 return funcTy->getDirectFormalResultsType (silConv.getModule (), context);
214214
215+ if (funcTy->hasAddressResult (silConv.loweredAddresses )) {
216+ assert (funcTy->getNumDirectFormalResults () == 1 );
217+ return SILType::getPrimitiveAddressType (
218+ funcTy->getSingleDirectFormalResult ().getReturnValueType (
219+ silConv.getModule (), funcTy, context));
220+ }
221+
215222 return funcTy->getAllResultsSubstType (silConv.getModule (), context);
216223 }
217224
@@ -322,27 +329,24 @@ class SILFunctionConventions {
322329 if (funcTy->getNumResults () != 1 ) {
323330 return false ;
324331 }
325- return funcTy->getResults ()[0 ].getConvention () ==
326- ResultConvention::Guaranteed;
327- }
328-
329- bool hasGuaranteedAddressResult () const {
330- if (funcTy->getNumResults () != 1 ) {
331- return false ;
332+ auto resultConvention = funcTy->getResults ()[0 ].getConvention ();
333+ if (silConv.loweredAddresses ) {
334+ return resultConvention == ResultConvention::Guaranteed;
332335 }
333- return funcTy-> getResults ()[ 0 ]. getConvention () ==
334- ResultConvention::GuaranteedAddress;
336+ return resultConvention == ResultConvention::Guaranteed ||
337+ resultConvention == ResultConvention::GuaranteedAddress;
335338 }
336339
337- bool hasInoutResult () const {
340+ bool hasAddressResult () const {
338341 if (funcTy->getNumResults () != 1 ) {
339342 return false ;
340343 }
341- return funcTy->getResults ()[0 ].getConvention () == ResultConvention::Inout;
342- }
343-
344- bool hasAddressResult () const {
345- return hasGuaranteedAddressResult () || hasInoutResult ();
344+ auto resultConvention = funcTy->getResults ()[0 ].getConvention ();
345+ if (silConv.loweredAddresses ) {
346+ return resultConvention == ResultConvention::GuaranteedAddress ||
347+ resultConvention == ResultConvention::Inout;
348+ }
349+ return resultConvention == ResultConvention::Inout;
346350 }
347351
348352 struct SILResultTypeFunc ;
@@ -711,7 +715,7 @@ inline SILType
711715SILModuleConventions::getSILResultInterfaceType (SILResultInfo result,
712716 bool loweredAddresses) {
713717 return SILModuleConventions::isIndirectSILResult (result, loweredAddresses) ||
714- result.isAddressResult ()
718+ result.isAddressResult (loweredAddresses )
715719 ? SILType::getPrimitiveAddressType (result.getInterfaceType ())
716720 : SILType::getPrimitiveObjectType (result.getInterfaceType ());
717721}
0 commit comments