Skip to content

Commit d30ba99

Browse files
committed
[CS] Use correct DeclContext when solving initializations
Use the PatternBindingInitializer context if we have one. This also uncovered a parser issue where we would mistakenly create a PatternBindingInitializer in top-level code.
1 parent 8320249 commit d30ba99

File tree

6 files changed

+14
-14
lines changed

6 files changed

+14
-14
lines changed

include/swift/Sema/SyntacticElementTarget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ class SyntacticElementTarget {
254254
/// Form a target for the initialization of a pattern binding entry from
255255
/// an expression.
256256
static SyntacticElementTarget
257-
forInitialization(Expr *initializer, DeclContext *dc, Type patternType,
257+
forInitialization(Expr *initializer, Type patternType,
258258
PatternBindingDecl *patternBinding,
259259
unsigned patternBindingIndex, bool bindPatternVarsOneWay);
260260

lib/Parse/ParseDecl.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8236,7 +8236,7 @@ Parser::parseDeclVar(ParseDeclOptions Flags,
82368236
// In var/let decl with multiple patterns, accumulate them all in this list
82378237
// so we can build our singular PatternBindingDecl at the end.
82388238
SmallVector<PatternBindingEntry, 4> PBDEntries;
8239-
auto BaseContext = CurDeclContext;
8239+
DeclContext *BindingContext = topLevelDecl ? topLevelDecl : CurDeclContext;
82408240

82418241
// No matter what error path we take, make sure the
82428242
// PatternBindingDecl/TopLevel code block are added.
@@ -8251,13 +8251,12 @@ Parser::parseDeclVar(ParseDeclOptions Flags,
82518251
// can finally create our PatternBindingDecl to represent the
82528252
// pattern/initializer pairs.
82538253
auto *PBD = PatternBindingDecl::create(Context, StaticLoc, StaticSpelling,
8254-
VarLoc, PBDEntries, BaseContext);
8254+
VarLoc, PBDEntries, BindingContext);
82558255

82568256
// If we're setting up a TopLevelCodeDecl, configure it by setting up the
82578257
// body that holds PBD and we're done. The TopLevelCodeDecl is already set
82588258
// up in Decls to be returned to caller.
82598259
if (topLevelDecl) {
8260-
PBD->setDeclContext(topLevelDecl);
82618260
auto range = PBD->getSourceRangeIncludingAttrs();
82628261
topLevelDecl->setBody(BraceStmt::create(Context, range.Start,
82638262
ASTNode(PBD), range.End, true));

lib/Sema/CSGen.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4547,7 +4547,7 @@ generateForEachStmtConstraints(ConstraintSystem &cs, DeclContext *dc,
45474547
ctx, StaticSpellingKind::None, pattern, makeIteratorCall, dc);
45484548

45494549
auto makeIteratorTarget = SyntacticElementTarget::forInitialization(
4550-
makeIteratorCall, dc, /*patternType=*/Type(), PB, /*index=*/0,
4550+
makeIteratorCall, /*patternType=*/Type(), PB, /*index=*/0,
45514551
/*shouldBindPatternsOneWay=*/false);
45524552

45534553
ContextualTypeInfo contextInfo(sequenceProto->getDeclaredInterfaceType(),
@@ -4870,7 +4870,7 @@ bool ConstraintSystem::generateConstraints(
48704870
}
48714871

48724872
auto target = init ? SyntacticElementTarget::forInitialization(
4873-
init, dc, patternType, patternBinding, index,
4873+
init, patternType, patternBinding, index,
48744874
/*bindPatternVarsOneWay=*/true)
48754875
: SyntacticElementTarget::forUninitializedVar(
48764876
patternBinding, index, patternType);

lib/Sema/CSSyntacticElement.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -751,8 +751,7 @@ class SyntacticElementConstraintGenerator
751751
// declaring local wrapped variables (yet).
752752
if (hasPropertyWrapper(pattern)) {
753753
auto target = SyntacticElementTarget::forInitialization(
754-
init, patternBinding->getDeclContext(), patternType, patternBinding,
755-
index,
754+
init, patternType, patternBinding, index,
756755
/*bindPatternVarsOneWay=*/false);
757756

758757
if (ConstraintSystem::preCheckTarget(
@@ -764,8 +763,7 @@ class SyntacticElementConstraintGenerator
764763

765764
if (init) {
766765
return SyntacticElementTarget::forInitialization(
767-
init, patternBinding->getDeclContext(), patternType, patternBinding,
768-
index,
766+
init, patternType, patternBinding, index,
769767
/*bindPatternVarsOneWay=*/false);
770768
}
771769

lib/Sema/SyntacticElementTarget.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,12 @@ SyntacticElementTarget::forInitialization(Expr *initializer, DeclContext *dc,
165165
}
166166

167167
SyntacticElementTarget SyntacticElementTarget::forInitialization(
168-
Expr *initializer, DeclContext *dc, Type patternType,
169-
PatternBindingDecl *patternBinding, unsigned patternBindingIndex,
170-
bool bindPatternVarsOneWay) {
168+
Expr *initializer, Type patternType, PatternBindingDecl *patternBinding,
169+
unsigned patternBindingIndex, bool bindPatternVarsOneWay) {
170+
auto *dc = patternBinding->getDeclContext();
171+
if (auto *initContext = patternBinding->getInitContext(patternBindingIndex))
172+
dc = initContext;
173+
171174
auto result = forInitialization(
172175
initializer, dc, patternType,
173176
patternBinding->getPattern(patternBindingIndex), bindPatternVarsOneWay);

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ bool TypeChecker::typeCheckBinding(Pattern *&pattern, Expr *&initializer,
805805
TypeCheckExprOptions options) {
806806
SyntacticElementTarget target =
807807
PBD ? SyntacticElementTarget::forInitialization(
808-
initializer, DC, patternType, PBD, patternNumber,
808+
initializer, patternType, PBD, patternNumber,
809809
/*bindPatternVarsOneWay=*/false)
810810
: SyntacticElementTarget::forInitialization(
811811
initializer, DC, patternType, pattern,

0 commit comments

Comments
 (0)