@@ -1171,8 +1171,8 @@ AnyFunctionRef::getYieldResultsImpl(SmallVectorImpl<AnyFunctionType::Yield> &buf
11711171 bool mapIntoContext) const {
11721172 assert (buffer.empty ());
11731173 if (auto *AFD = getAbstractFunctionDecl ()) {
1174+ // FIXME: AccessorDecl case is not necessary
11741175 if (auto *AD = dyn_cast<AccessorDecl>(AFD)) {
1175- // FIXME: AccessorDecl case is not necessary
11761176 if (AD->isCoroutine ()) {
11771177 auto valueTy = AD->getStorage ()->getValueInterfaceType ()
11781178 ->getReferenceStorageReferent ();
@@ -1185,13 +1185,14 @@ AnyFunctionRef::getYieldResultsImpl(SmallVectorImpl<AnyFunctionType::Yield> &buf
11851185 return buffer;
11861186 }
11871187 } else if (AFD->isCoroutine ()) {
1188- auto resType = AFD->getInterfaceType ()->castTo <FunctionType>()->getResult ();
1189- if (auto *resFnType = resType->getAs <FunctionType>())
1190- resType = resFnType->getResult ();
1191-
1192- if (resType->hasError ())
1188+ auto fnType = AFD->getInterfaceType ();
1189+ if (fnType->hasError ())
11931190 return {};
11941191
1192+ auto resType = fnType->castTo <AnyFunctionType>()->getResult ();
1193+ if (auto *resFnType = resType->getAs <AnyFunctionType>())
1194+ resType = resFnType->getResult ();
1195+
11951196 auto addYieldInfo =
11961197 [&](const YieldResultType *yieldResultTy) {
11971198 Type valueTy = yieldResultTy->getResultType ();
@@ -1208,8 +1209,8 @@ AnyFunctionRef::getYieldResultsImpl(SmallVectorImpl<AnyFunctionType::Yield> &buf
12081209 if (auto *yieldResTy = eltTy->getAs <YieldResultType>())
12091210 addYieldInfo (yieldResTy);
12101211 }
1211- else
1212- addYieldInfo (resType-> castTo <YieldResultType>() );
1212+ else if ( auto *yieldResTy = resType-> getAs <YieldResultType>())
1213+ addYieldInfo (yieldResTy );
12131214
12141215 return buffer;
12151216 }
@@ -10822,8 +10823,7 @@ Type FuncDecl::getResultInterfaceTypeWithoutYields() const {
1082210823 resultType = elements[0 ].getType ();
1082310824 else
1082410825 resultType = TupleType::get (elements, getASTContext ());
10825- } else {
10826- assert (resultType->is <YieldResultType>());
10826+ } else if (resultType->is <YieldResultType>()) {
1082710827 resultType = TupleType::getEmpty (getASTContext ());
1082810828 }
1082910829 }
@@ -10851,8 +10851,8 @@ Type FuncDecl::getYieldsInterfaceType() const {
1085110851 }
1085210852
1085310853 llvm_unreachable (" coroutine must have a yield result" );
10854- } else {
10855- assert ( resultType-> is <YieldResultType> ());
10854+ } else if (!resultType-> is <YieldResultType>()) {
10855+ resultType = TupleType::getEmpty ( getASTContext ());
1085610856 }
1085710857
1085810858 return resultType;
0 commit comments