@@ -1391,8 +1391,8 @@ AnyFunctionRef::getYieldResultsImpl(SmallVectorImpl<AnyFunctionType::Yield> &buf
13911391 bool mapIntoContext) const {
13921392 assert (buffer.empty ());
13931393 if (auto *AFD = getAbstractFunctionDecl ()) {
1394+ // FIXME: AccessorDecl case is not necessary
13941395 if (auto *AD = dyn_cast<AccessorDecl>(AFD)) {
1395- // FIXME: AccessorDecl case is not necessary
13961396 if (AD->isCoroutine ()) {
13971397 auto valueTy = AD->getStorage ()->getValueInterfaceType ()
13981398 ->getReferenceStorageReferent ();
@@ -1405,13 +1405,14 @@ AnyFunctionRef::getYieldResultsImpl(SmallVectorImpl<AnyFunctionType::Yield> &buf
14051405 return buffer;
14061406 }
14071407 } else if (AFD->isCoroutine ()) {
1408- auto resType = AFD->getInterfaceType ()->castTo <FunctionType>()->getResult ();
1409- if (auto *resFnType = resType->getAs <FunctionType>())
1410- resType = resFnType->getResult ();
1411-
1412- if (resType->hasError ())
1408+ auto fnType = AFD->getInterfaceType ();
1409+ if (fnType->hasError ())
14131410 return {};
14141411
1412+ auto resType = fnType->castTo <AnyFunctionType>()->getResult ();
1413+ if (auto *resFnType = resType->getAs <AnyFunctionType>())
1414+ resType = resFnType->getResult ();
1415+
14151416 auto addYieldInfo =
14161417 [&](const YieldResultType *yieldResultTy) {
14171418 Type valueTy = yieldResultTy->getResultType ();
@@ -1428,8 +1429,8 @@ AnyFunctionRef::getYieldResultsImpl(SmallVectorImpl<AnyFunctionType::Yield> &buf
14281429 if (auto *yieldResTy = eltTy->getAs <YieldResultType>())
14291430 addYieldInfo (yieldResTy);
14301431 }
1431- else
1432- addYieldInfo (resType-> castTo <YieldResultType>() );
1432+ else if ( auto *yieldResTy = resType-> getAs <YieldResultType>())
1433+ addYieldInfo (yieldResTy );
14331434
14341435 return buffer;
14351436 }
@@ -11441,8 +11442,7 @@ Type FuncDecl::getResultInterfaceTypeWithoutYields() const {
1144111442 resultType = elements[0 ].getType ();
1144211443 else
1144311444 resultType = TupleType::get (elements, getASTContext ());
11444- } else {
11445- assert (resultType->is <YieldResultType>());
11445+ } else if (resultType->is <YieldResultType>()) {
1144611446 resultType = TupleType::getEmpty (getASTContext ());
1144711447 }
1144811448 }
@@ -11470,8 +11470,8 @@ Type FuncDecl::getYieldsInterfaceType() const {
1147011470 }
1147111471
1147211472 llvm_unreachable (" coroutine must have a yield result" );
11473- } else {
11474- assert ( resultType-> is <YieldResultType> ());
11473+ } else if (!resultType-> is <YieldResultType>()) {
11474+ resultType = TupleType::getEmpty ( getASTContext ());
1147511475 }
1147611476
1147711477 return resultType;
0 commit comments