@@ -1411,9 +1411,9 @@ evaluator::SideEffect ExpandChildTypeRefinementContextsRequest::evaluate(
14111411 return evaluator::SideEffect ();
14121412}
14131413
1414- AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation (
1415- SourceLoc loc, const DeclContext *DC,
1416- const TypeRefinementContext **MostRefined) {
1414+ AvailabilityContext
1415+ TypeChecker::availabilityAtLocation ( SourceLoc loc, const DeclContext *DC,
1416+ const TypeRefinementContext **MostRefined) {
14171417 SourceFile *SF;
14181418 if (loc.isValid ())
14191419 SF = DC->getParentModule ()->getSourceFileContainingLocation (loc);
@@ -1436,7 +1436,7 @@ AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation(
14361436 // this will be a real problem.
14371437
14381438 // We can assume we are running on at least the minimum inlining target.
1439- auto OverApproximateContext = AvailabilityRange::forInliningTarget (Context);
1439+ auto baseAvailability = AvailabilityContext::getDefault (Context);
14401440 auto isInvalidLoc = [SF](SourceLoc loc) {
14411441 return SF ? loc.isInvalid () : true ;
14421442 };
@@ -1445,34 +1445,35 @@ AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation(
14451445 if (!D)
14461446 break ;
14471447
1448+ baseAvailability.constrainWithDecl (D);
14481449 loc = D->getLoc ();
1450+ DC = D->getDeclContext ();
1451+ }
14491452
1450- std::optional<AvailabilityRange> Info =
1451- AvailabilityInference::annotatedAvailableRange (D) ;
1453+ if (!SF || loc. isInvalid ())
1454+ return baseAvailability ;
14521455
1453- if (Info. has_value ()) {
1454- OverApproximateContext. constrainWith (Info. value ());
1455- }
1456+ TypeRefinementContext *rootTRC = getOrBuildTypeRefinementContext (SF);
1457+ if (!rootTRC)
1458+ return baseAvailability;
14561459
1457- DC = D->getDeclContext ();
1458- }
1460+ TypeRefinementContext *TRC = rootTRC->findMostRefinedSubContext (loc, Context);
1461+ if (!TRC)
1462+ return baseAvailability;
14591463
1460- if (SF && loc.isValid ()) {
1461- TypeRefinementContext *rootTRC = getOrBuildTypeRefinementContext (SF);
1462- if (rootTRC) {
1463- TypeRefinementContext *TRC =
1464- rootTRC->findMostRefinedSubContext (loc, Context);
1465- if (TRC) {
1466- OverApproximateContext.constrainWith (
1467- TRC->getPlatformAvailabilityRange ());
1468- if (MostRefined) {
1469- *MostRefined = TRC;
1470- }
1471- }
1472- }
1464+ if (MostRefined) {
1465+ *MostRefined = TRC;
14731466 }
14741467
1475- return OverApproximateContext;
1468+ auto availability = TRC->getAvailabilityContext ();
1469+ availability.constrainWithContext (baseAvailability, Context);
1470+ return availability;
1471+ }
1472+
1473+ AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation (
1474+ SourceLoc loc, const DeclContext *DC,
1475+ const TypeRefinementContext **MostRefined) {
1476+ return availabilityAtLocation (loc, DC, MostRefined).getPlatformRange ();
14761477}
14771478
14781479bool TypeChecker::isDeclarationUnavailable (
0 commit comments