Skip to content

Commit 8485740

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 after parsing the initializers.
1 parent 47f7a31 commit 8485740

File tree

6 files changed

+14
-14
lines changed

6 files changed

+14
-14
lines changed

include/swift/Sema/SyntacticElementTarget.h

+1-1
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

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

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

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

lib/Sema/CSGen.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -4553,7 +4553,7 @@ generateForEachStmtConstraints(ConstraintSystem &cs, DeclContext *dc,
45534553
ctx, StaticSpellingKind::None, pattern, makeIteratorCall, dc);
45544554

45554555
auto makeIteratorTarget = SyntacticElementTarget::forInitialization(
4556-
makeIteratorCall, dc, /*patternType=*/Type(), PB, /*index=*/0,
4556+
makeIteratorCall, /*patternType=*/Type(), PB, /*index=*/0,
45574557
/*shouldBindPatternsOneWay=*/false);
45584558

45594559
ContextualTypeInfo contextInfo(sequenceProto->getDeclaredInterfaceType(),
@@ -4876,7 +4876,7 @@ bool ConstraintSystem::generateConstraints(
48764876
}
48774877

48784878
auto target = init ? SyntacticElementTarget::forInitialization(
4879-
init, dc, patternType, patternBinding, index,
4879+
init, patternType, patternBinding, index,
48804880
/*bindPatternVarsOneWay=*/true)
48814881
: SyntacticElementTarget::forUninitializedVar(
48824882
patternBinding, index, patternType);

lib/Sema/CSSyntacticElement.cpp

+2-4
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

+6-3
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

+1-1
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ bool TypeChecker::typeCheckBinding(Pattern *&pattern, Expr *&initializer,
821821
TypeCheckExprOptions options) {
822822
SyntacticElementTarget target =
823823
PBD ? SyntacticElementTarget::forInitialization(
824-
initializer, DC, patternType, PBD, patternNumber,
824+
initializer, patternType, PBD, patternNumber,
825825
/*bindPatternVarsOneWay=*/false)
826826
: SyntacticElementTarget::forInitialization(
827827
initializer, DC, patternType, pattern,

0 commit comments

Comments
 (0)