Skip to content

Commit 0d5987d

Browse files
committed
[Multi-expression closures] Add support for 'defer' statement.
1 parent 1ee7672 commit 0d5987d

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/Sema/CSClosure.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,12 @@ class ClosureConstraintGenerator
174174

175175
void visitBreakStmt(BreakStmt *breakStmt) { }
176176
void visitContinueStmt(ContinueStmt *continueStmt) { }
177+
void visitDeferStmt(DeferStmt *deferStmt) { }
177178

178179
#define UNSUPPORTED_STMT(STMT) void visit##STMT##Stmt(STMT##Stmt *) { \
179180
llvm_unreachable("Unsupported statement kind " #STMT); \
180181
}
181182
UNSUPPORTED_STMT(Yield)
182-
UNSUPPORTED_STMT(Defer)
183183
UNSUPPORTED_STMT(DoCatch)
184184
UNSUPPORTED_STMT(Switch)
185185
UNSUPPORTED_STMT(Case)
@@ -440,11 +440,20 @@ class ClosureConstraintApplication
440440
return continueStmt;
441441
}
442442

443+
ASTNode visitDeferStmt(DeferStmt *deferStmt) {
444+
TypeChecker::typeCheckDecl(deferStmt->getTempDecl());
445+
446+
Expr *theCall = deferStmt->getCallExpr();
447+
TypeChecker::typeCheckExpression(theCall, closure);
448+
deferStmt->setCallExpr(theCall);
449+
450+
return deferStmt;
451+
}
452+
443453
#define UNSUPPORTED_STMT(STMT) ASTNode visit##STMT##Stmt(STMT##Stmt *) { \
444454
llvm_unreachable("Unsupported statement kind " #STMT); \
445455
}
446456
UNSUPPORTED_STMT(Yield)
447-
UNSUPPORTED_STMT(Defer)
448457
UNSUPPORTED_STMT(DoCatch)
449458
UNSUPPORTED_STMT(Switch)
450459
UNSUPPORTED_STMT(Case)

test/expr/closure/multi_statement.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ func mapWithMoreStatements(ints: [Int]) {
3838
}
3939
} while random(i)
4040

41+
defer {
42+
print("I am so done here")
43+
}
44+
4145
for j in 0..<i where j % 2 == 0 {
4246
if j % 7 == 0 {
4347
continue

0 commit comments

Comments
 (0)