Skip to content

Commit 3555299

Browse files
committed
[TypeChecker] Teach declaration type-checking about LeaveClosureBodyUnchecked flag
Propagate `LeaveClosureBodyUnchecked` flag from `typeCheckASTNodeAtLoc` down to declaration checker to skip checking closures associated with pattern binding entry initializers. This is no-op until multi-statement inference becomes enabled by default.
1 parent ceb6d7e commit 3555299

File tree

5 files changed

+39
-18
lines changed

5 files changed

+39
-18
lines changed

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,11 @@ Type TypeChecker::typeCheckParameterDefault(Expr *&defaultValue,
431431
: CTP_DefaultParameter});
432432
}
433433

434-
bool TypeChecker::typeCheckBinding(
435-
Pattern *&pattern, Expr *&initializer, DeclContext *DC,
436-
Type patternType, PatternBindingDecl *PBD, unsigned patternNumber) {
434+
bool TypeChecker::typeCheckBinding(Pattern *&pattern, Expr *&initializer,
435+
DeclContext *DC, Type patternType,
436+
PatternBindingDecl *PBD,
437+
unsigned patternNumber,
438+
TypeCheckExprOptions options) {
437439
SolutionApplicationTarget target =
438440
PBD ? SolutionApplicationTarget::forInitialization(
439441
initializer, DC, patternType, PBD, patternNumber,
@@ -491,7 +493,8 @@ bool TypeChecker::typeCheckBinding(
491493

492494
bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
493495
unsigned patternNumber,
494-
Type patternType) {
496+
Type patternType,
497+
TypeCheckExprOptions options) {
495498
Pattern *pattern = PBD->getPattern(patternNumber);
496499
Expr *init = PBD->getInit(patternNumber);
497500

@@ -520,8 +523,8 @@ bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
520523
}
521524
}
522525

523-
bool hadError = TypeChecker::typeCheckBinding(
524-
pattern, init, DC, patternType, PBD, patternNumber);
526+
bool hadError = TypeChecker::typeCheckBinding(pattern, init, DC, patternType,
527+
PBD, patternNumber, options);
525528
if (!init) {
526529
PBD->setInvalid();
527530
return true;

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16701670
ASTContext &Ctx;
16711671
SourceFile *SF;
16721672

1673-
explicit DeclChecker(ASTContext &ctx, SourceFile *SF) : Ctx(ctx), SF(SF) {}
1673+
bool LeaveClosureBodiesUnchecked;
1674+
1675+
explicit DeclChecker(ASTContext &ctx, SourceFile *SF,
1676+
bool LeaveClosureBodiesUnchecked = false)
1677+
: Ctx(ctx), SF(SF),
1678+
LeaveClosureBodiesUnchecked(LeaveClosureBodiesUnchecked) {}
16741679

16751680
ASTContext &getASTContext() const { return Ctx; }
16761681
void addDelayedFunction(AbstractFunctionDecl *AFD) {
@@ -2044,7 +2049,13 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
20442049
continue;
20452050

20462051
if (!PBD->isInitializerChecked(i)) {
2047-
TypeChecker::typeCheckPatternBinding(PBD, i);
2052+
TypeCheckExprOptions options;
2053+
2054+
if (LeaveClosureBodiesUnchecked)
2055+
options |= TypeCheckExprFlags::LeaveClosureBodyUnchecked;
2056+
2057+
TypeChecker::typeCheckPatternBinding(PBD, i, /*patternType=*/Type(),
2058+
options);
20482059
}
20492060

20502061
if (!PBD->isInvalid()) {
@@ -3164,9 +3175,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
31643175
};
31653176
} // end anonymous namespace
31663177

3167-
void TypeChecker::typeCheckDecl(Decl *D) {
3178+
void TypeChecker::typeCheckDecl(Decl *D, bool LeaveClosureBodiesUnchecked) {
31683179
auto *SF = D->getDeclContext()->getParentSourceFile();
3169-
DeclChecker(D->getASTContext(), SF).visit(D);
3180+
DeclChecker(D->getASTContext(), SF, LeaveClosureBodiesUnchecked).visit(D);
31703181
}
31713182

31723183
void TypeChecker::checkParameterList(ParameterList *params,

lib/Sema/TypeCheckStmt.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1514,7 +1514,7 @@ void StmtChecker::typeCheckASTNode(ASTNode &node) {
15141514

15151515
// Type check the declaration.
15161516
if (auto *D = node.dyn_cast<Decl *>()) {
1517-
TypeChecker::typeCheckDecl(D);
1517+
TypeChecker::typeCheckDecl(D, LeaveBraceStmtBodyUnchecked);
15181518
return;
15191519
}
15201520

lib/Sema/TypeChecker.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,15 +446,20 @@ swift::handleSILGenericParams(GenericParamList *genericParams,
446446
}
447447

448448
void swift::typeCheckPatternBinding(PatternBindingDecl *PBD,
449-
unsigned bindingIndex) {
449+
unsigned bindingIndex,
450+
bool leaveClosureBodiesUnchecked) {
450451
assert(!PBD->isInitializerChecked(bindingIndex) &&
451452
PBD->getInit(bindingIndex));
452453

453454
auto &Ctx = PBD->getASTContext();
454455
DiagnosticSuppression suppression(Ctx.Diags);
455-
(void)evaluateOrDefault(
456-
Ctx.evaluator, PatternBindingEntryRequest{PBD, bindingIndex}, nullptr);
457-
TypeChecker::typeCheckPatternBinding(PBD, bindingIndex);
456+
457+
TypeCheckExprOptions options;
458+
if (leaveClosureBodiesUnchecked)
459+
options |= TypeCheckExprFlags::LeaveClosureBodyUnchecked;
460+
461+
TypeChecker::typeCheckPatternBinding(PBD, bindingIndex,
462+
/*patternType=*/Type(), options);
458463
}
459464

460465
bool swift::typeCheckASTNodeAtLoc(DeclContext *DC, SourceLoc TargetLoc) {

lib/Sema/TypeChecker.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ Type typeCheckParameterDefault(Expr *&defaultValue, DeclContext *DC,
400400

401401
void typeCheckTopLevelCodeDecl(TopLevelCodeDecl *TLCD);
402402

403-
void typeCheckDecl(Decl *D);
403+
void typeCheckDecl(Decl *D, bool LeaveClosureBodiesUnchecked = false);
404404

405405
void addImplicitDynamicAttribute(Decl *D);
406406
void checkDeclAttributes(Decl *D);
@@ -626,9 +626,11 @@ void coerceParameterListToType(ParameterList *P, AnyFunctionType *FN);
626626
bool typeCheckBinding(Pattern *&P, Expr *&Init, DeclContext *DC,
627627
Type patternType,
628628
PatternBindingDecl *PBD = nullptr,
629-
unsigned patternNumber = 0);
629+
unsigned patternNumber = 0,
630+
TypeCheckExprOptions options = {});
630631
bool typeCheckPatternBinding(PatternBindingDecl *PBD, unsigned patternNumber,
631-
Type patternType = Type());
632+
Type patternType = Type(),
633+
TypeCheckExprOptions options = {});
632634

633635
/// Type-check a for-each loop's pattern binding and sequence together.
634636
///

0 commit comments

Comments
 (0)