@@ -28,12 +28,14 @@ using namespace swift;
2828TypeRefinementContext::TypeRefinementContext (ASTContext &Ctx, IntroNode Node,
2929 TypeRefinementContext *Parent,
3030 SourceRange SrcRange,
31- const AvailabilityContext &Info)
32- : Node(Node), SrcRange(SrcRange), AvailabilityInfo(Info) {
31+ const AvailabilityContext &Info,
32+ const AvailabilityContext &InfoExplicit)
33+ : Node(Node), SrcRange(SrcRange), AvailabilityInfo(Info),
34+ AvailabilityInfoExplicit(InfoExplicit) {
3335 if (Parent) {
3436 assert (SrcRange.isValid ());
3537 Parent->addChild (this );
36- assert (Info .isContainedIn (Parent->getAvailabilityInfo ()));
38+ assert (InfoExplicit .isContainedIn (Parent->getAvailabilityInfoExplicit ()));
3739 }
3840 Ctx.addDestructorCleanup (Children);
3941}
@@ -46,18 +48,20 @@ TypeRefinementContext::createRoot(SourceFile *SF,
4648 ASTContext &Ctx = SF->getASTContext ();
4749 return new (Ctx)
4850 TypeRefinementContext (Ctx, SF,
49- /* Parent=*/ nullptr , SourceRange (), Info);
51+ /* Parent=*/ nullptr , SourceRange (), Info,
52+ AvailabilityContext::alwaysAvailable ());
5053}
5154
5255TypeRefinementContext *
5356TypeRefinementContext::createForDecl (ASTContext &Ctx, Decl *D,
5457 TypeRefinementContext *Parent,
5558 const AvailabilityContext &Info,
59+ const AvailabilityContext &InfoExplicit,
5660 SourceRange SrcRange) {
5761 assert (D);
5862 assert (Parent);
5963 return new (Ctx)
60- TypeRefinementContext (Ctx, D, Parent, SrcRange, Info);
64+ TypeRefinementContext (Ctx, D, Parent, SrcRange, Info, InfoExplicit );
6165}
6266
6367TypeRefinementContext *
@@ -68,7 +72,7 @@ TypeRefinementContext::createForIfStmtThen(ASTContext &Ctx, IfStmt *S,
6872 assert (Parent);
6973 return new (Ctx)
7074 TypeRefinementContext (Ctx, IntroNode (S, /* IsThen=*/ true ), Parent,
71- S->getThenStmt ()->getSourceRange (), Info);
75+ S->getThenStmt ()->getSourceRange (), Info, Info );
7276}
7377
7478TypeRefinementContext *
@@ -79,7 +83,7 @@ TypeRefinementContext::createForIfStmtElse(ASTContext &Ctx, IfStmt *S,
7983 assert (Parent);
8084 return new (Ctx)
8185 TypeRefinementContext (Ctx, IntroNode (S, /* IsThen=*/ false ), Parent,
82- S->getElseStmt ()->getSourceRange (), Info);
86+ S->getElseStmt ()->getSourceRange (), Info, Info );
8387}
8488
8589TypeRefinementContext *
@@ -92,7 +96,7 @@ TypeRefinementContext::createForConditionFollowingQuery(ASTContext &Ctx,
9296 assert (Parent);
9397 SourceRange Range (PAI->getEndLoc (), LastElement.getEndLoc ());
9498 return new (Ctx) TypeRefinementContext (Ctx, PAI, Parent, Range,
95- Info);
99+ Info, Info );
96100}
97101
98102TypeRefinementContext *
@@ -107,7 +111,7 @@ TypeRefinementContext::createForGuardStmtFallthrough(ASTContext &Ctx,
107111 SourceRange Range (RS->getEndLoc (), ContainingBraceStmt->getEndLoc ());
108112 return new (Ctx) TypeRefinementContext (Ctx,
109113 IntroNode (RS, /* IsFallthrough=*/ true ),
110- Parent, Range, Info);
114+ Parent, Range, Info, Info );
111115}
112116
113117TypeRefinementContext *
@@ -118,7 +122,7 @@ TypeRefinementContext::createForGuardStmtElse(ASTContext &Ctx, GuardStmt *RS,
118122 assert (Parent);
119123 return new (Ctx)
120124 TypeRefinementContext (Ctx, IntroNode (RS, /* IsFallthrough=*/ false ), Parent,
121- RS->getBody ()->getSourceRange (), Info);
125+ RS->getBody ()->getSourceRange (), Info, Info );
122126}
123127
124128TypeRefinementContext *
@@ -128,7 +132,7 @@ TypeRefinementContext::createForWhileStmtBody(ASTContext &Ctx, WhileStmt *S,
128132 assert (S);
129133 assert (Parent);
130134 return new (Ctx) TypeRefinementContext (
131- Ctx, S, Parent, S->getBody ()->getSourceRange (), Info);
135+ Ctx, S, Parent, S->getBody ()->getSourceRange (), Info, Info );
132136}
133137
134138// Only allow allocation of TypeRefinementContext using the allocator in
@@ -296,6 +300,7 @@ void TypeRefinementContext::print(raw_ostream &OS, SourceManager &SrcMgr,
296300 OS << " (" << getReasonName (getReason ());
297301
298302 OS << " versions=" << AvailabilityInfo.getOSVersion ().getAsString ();
303+ OS << " explicit=" << AvailabilityInfoExplicit.getOSVersion ().getAsString ();
299304
300305 if (getReason () == Reason::Decl) {
301306 Decl *D = Node.getAsDecl ();
0 commit comments