@@ -4726,27 +4726,24 @@ class SILFunctionType final
47264726 using Representation = SILExtInfoBuilder::Representation;
47274727
47284728private:
4729- unsigned NumParameters = 0 ;
4729+ unsigned NumParameters;
47304730
4731- // These are *normal* results
4732- unsigned NumAnyResults = 0 ; // Not including the ErrorResult.
4733- unsigned NumAnyIndirectFormalResults = 0 ; // Subset of NumAnyResults.
4734- unsigned NumPackResults = 0 ; // Subset of NumAnyIndirectFormalResults.
4735- // These are *yield* results
4736- unsigned NumAnyYieldResults = 0 ; // Not including the ErrorResult.
4737- unsigned NumAnyIndirectFormalYieldResults = 0 ; // Subset of NumAnyYieldResults.
4738- unsigned NumPackYieldResults = 0 ; // Subset of NumAnyIndirectFormalYieldResults.
4731+ // These are *normal* results if this is not a coroutine and *yield* results
4732+ // otherwise.
4733+ unsigned NumAnyResults; // Not including the ErrorResult.
4734+ unsigned NumAnyIndirectFormalResults; // Subset of NumAnyResults.
4735+ unsigned NumPackResults; // Subset of NumAnyIndirectFormalResults.
47394736
47404737 // [NOTE: SILFunctionType-layout]
47414738 // The layout of a SILFunctionType in memory is:
47424739 // SILFunctionType
47434740 // SILParameterInfo[NumParameters]
4744- // SILResultInfo[NumAnyResults]
4741+ // SILResultInfo[isCoroutine() ? 0 : NumAnyResults]
47454742 // SILResultInfo? // if hasErrorResult()
4746- // SILYieldInfo[NumAnyYieldResults ]
4743+ // SILYieldInfo[isCoroutine() ? NumAnyResults : 0 ]
47474744 // SubstitutionMap[HasPatternSubs + HasInvocationSubs]
4748- // CanType? // if NumAnyResults > 1, formal result cache
4749- // CanType? // if NumAnyResults > 1, all result cache
4745+ // CanType? // if !isCoro && NumAnyResults > 1, formal result cache
4746+ // CanType? // if !isCoro && NumAnyResults > 1, all result cache
47504747
47514748 CanGenericSignature InvocationGenericSig;
47524749 ProtocolConformanceRef WitnessMethodConformance;
@@ -4785,7 +4782,7 @@ class SILFunctionType final
47854782
47864783 // / Do we have slots for caches of the normal-result tuple type?
47874784 bool hasResultCache () const {
4788- return NumAnyResults > 1 ;
4785+ return NumAnyResults > 1 && ! isCoroutine () ;
47894786 }
47904787
47914788 CanType &getMutableFormalResultsCache () const {
@@ -4873,14 +4870,14 @@ class SILFunctionType final
48734870 ArrayRef<SILYieldInfo> getYields () const {
48744871 return const_cast <SILFunctionType *>(this )->getMutableYields ();
48754872 }
4876- unsigned getNumYields () const { return NumAnyYieldResults ; }
4873+ unsigned getNumYields () const { return isCoroutine () ? NumAnyResults : 0 ; }
48774874
48784875 // / Return the array of all result information. This may contain inter-mingled
48794876 // / direct and indirect results.
48804877 ArrayRef<SILResultInfo> getResults () const {
48814878 return const_cast <SILFunctionType *>(this )->getMutableResults ();
48824879 }
4883- unsigned getNumResults () const { return NumAnyResults; }
4880+ unsigned getNumResults () const { return isCoroutine () ? 0 : NumAnyResults; }
48844881
48854882 ArrayRef<SILResultInfo> getResultsWithError () const {
48864883 return const_cast <SILFunctionType *>(this )->getMutableResultsWithError ();
@@ -4917,17 +4914,17 @@ class SILFunctionType final
49174914 // indirect property, not the SIL indirect property, should be consulted to
49184915 // determine whether function reabstraction is necessary.
49194916 unsigned getNumIndirectFormalResults () const {
4920- return NumAnyIndirectFormalResults;
4917+ return isCoroutine () ? 0 : NumAnyIndirectFormalResults;
49214918 }
49224919 // / Does this function have any formally indirect results?
49234920 bool hasIndirectFormalResults () const {
49244921 return getNumIndirectFormalResults () != 0 ;
49254922 }
49264923 unsigned getNumDirectFormalResults () const {
4927- return NumAnyResults - NumAnyIndirectFormalResults;
4924+ return isCoroutine () ? 0 : NumAnyResults - NumAnyIndirectFormalResults;
49284925 }
49294926 unsigned getNumPackResults () const {
4930- return NumPackResults;
4927+ return isCoroutine () ? 0 : NumPackResults;
49314928 }
49324929 bool hasIndirectErrorResult () const {
49334930 return hasErrorResult () && getErrorResult ().isFormalIndirect ();
@@ -4985,17 +4982,17 @@ class SILFunctionType final
49854982 TypeExpansionContext expansion);
49864983
49874984 unsigned getNumIndirectFormalYields () const {
4988- return NumAnyIndirectFormalYieldResults ;
4985+ return isCoroutine () ? NumAnyIndirectFormalResults : 0 ;
49894986 }
49904987 // / Does this function have any formally indirect yields?
49914988 bool hasIndirectFormalYields () const {
49924989 return getNumIndirectFormalYields () != 0 ;
49934990 }
49944991 unsigned getNumDirectFormalYields () const {
4995- return NumAnyYieldResults - NumAnyIndirectFormalYieldResults ;
4992+ return isCoroutine () ? NumAnyResults - NumAnyIndirectFormalResults : 0 ;
49964993 }
49974994 unsigned getNumPackYields () const {
4998- return NumPackYieldResults ;
4995+ return isCoroutine () ? NumPackResults : 0 ;
49994996 }
50004997
50014998 struct IndirectFormalYieldFilter {
0 commit comments