@@ -28,12 +28,14 @@ using namespace swift;
28
28
TypeRefinementContext::TypeRefinementContext (ASTContext &Ctx, IntroNode Node,
29
29
TypeRefinementContext *Parent,
30
30
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) {
33
35
if (Parent) {
34
36
assert (SrcRange.isValid ());
35
37
Parent->addChild (this );
36
- assert (Info .isContainedIn (Parent->getAvailabilityInfo ()));
38
+ assert (InfoExplicit .isContainedIn (Parent->getAvailabilityInfoExplicit ()));
37
39
}
38
40
Ctx.addDestructorCleanup (Children);
39
41
}
@@ -46,18 +48,20 @@ TypeRefinementContext::createRoot(SourceFile *SF,
46
48
ASTContext &Ctx = SF->getASTContext ();
47
49
return new (Ctx)
48
50
TypeRefinementContext (Ctx, SF,
49
- /* Parent=*/ nullptr , SourceRange (), Info);
51
+ /* Parent=*/ nullptr , SourceRange (), Info,
52
+ AvailabilityContext::alwaysAvailable ());
50
53
}
51
54
52
55
TypeRefinementContext *
53
56
TypeRefinementContext::createForDecl (ASTContext &Ctx, Decl *D,
54
57
TypeRefinementContext *Parent,
55
58
const AvailabilityContext &Info,
59
+ const AvailabilityContext &InfoExplicit,
56
60
SourceRange SrcRange) {
57
61
assert (D);
58
62
assert (Parent);
59
63
return new (Ctx)
60
- TypeRefinementContext (Ctx, D, Parent, SrcRange, Info);
64
+ TypeRefinementContext (Ctx, D, Parent, SrcRange, Info, InfoExplicit );
61
65
}
62
66
63
67
TypeRefinementContext *
@@ -68,7 +72,7 @@ TypeRefinementContext::createForIfStmtThen(ASTContext &Ctx, IfStmt *S,
68
72
assert (Parent);
69
73
return new (Ctx)
70
74
TypeRefinementContext (Ctx, IntroNode (S, /* IsThen=*/ true ), Parent,
71
- S->getThenStmt ()->getSourceRange (), Info);
75
+ S->getThenStmt ()->getSourceRange (), Info, Info );
72
76
}
73
77
74
78
TypeRefinementContext *
@@ -79,7 +83,7 @@ TypeRefinementContext::createForIfStmtElse(ASTContext &Ctx, IfStmt *S,
79
83
assert (Parent);
80
84
return new (Ctx)
81
85
TypeRefinementContext (Ctx, IntroNode (S, /* IsThen=*/ false ), Parent,
82
- S->getElseStmt ()->getSourceRange (), Info);
86
+ S->getElseStmt ()->getSourceRange (), Info, Info );
83
87
}
84
88
85
89
TypeRefinementContext *
@@ -92,7 +96,7 @@ TypeRefinementContext::createForConditionFollowingQuery(ASTContext &Ctx,
92
96
assert (Parent);
93
97
SourceRange Range (PAI->getEndLoc (), LastElement.getEndLoc ());
94
98
return new (Ctx) TypeRefinementContext (Ctx, PAI, Parent, Range,
95
- Info);
99
+ Info, Info );
96
100
}
97
101
98
102
TypeRefinementContext *
@@ -107,7 +111,7 @@ TypeRefinementContext::createForGuardStmtFallthrough(ASTContext &Ctx,
107
111
SourceRange Range (RS->getEndLoc (), ContainingBraceStmt->getEndLoc ());
108
112
return new (Ctx) TypeRefinementContext (Ctx,
109
113
IntroNode (RS, /* IsFallthrough=*/ true ),
110
- Parent, Range, Info);
114
+ Parent, Range, Info, Info );
111
115
}
112
116
113
117
TypeRefinementContext *
@@ -118,7 +122,7 @@ TypeRefinementContext::createForGuardStmtElse(ASTContext &Ctx, GuardStmt *RS,
118
122
assert (Parent);
119
123
return new (Ctx)
120
124
TypeRefinementContext (Ctx, IntroNode (RS, /* IsFallthrough=*/ false ), Parent,
121
- RS->getBody ()->getSourceRange (), Info);
125
+ RS->getBody ()->getSourceRange (), Info, Info );
122
126
}
123
127
124
128
TypeRefinementContext *
@@ -128,7 +132,7 @@ TypeRefinementContext::createForWhileStmtBody(ASTContext &Ctx, WhileStmt *S,
128
132
assert (S);
129
133
assert (Parent);
130
134
return new (Ctx) TypeRefinementContext (
131
- Ctx, S, Parent, S->getBody ()->getSourceRange (), Info);
135
+ Ctx, S, Parent, S->getBody ()->getSourceRange (), Info, Info );
132
136
}
133
137
134
138
// Only allow allocation of TypeRefinementContext using the allocator in
@@ -296,6 +300,7 @@ void TypeRefinementContext::print(raw_ostream &OS, SourceManager &SrcMgr,
296
300
OS << " (" << getReasonName (getReason ());
297
301
298
302
OS << " versions=" << AvailabilityInfo.getOSVersion ().getAsString ();
303
+ OS << " explicit=" << AvailabilityInfoExplicit.getOSVersion ().getAsString ();
299
304
300
305
if (getReason () == Reason::Decl) {
301
306
Decl *D = Node.getAsDecl ();
0 commit comments