Skip to content

Commit 0219ecd

Browse files
authored
Merge pull request #4345 from MnO2/swift-3.0-branch
[Sema] SR-2327: cherry-pick the change from pull request 4286 for `swift-3.0-branch`
2 parents f4b1d14 + 92c0d89 commit 0219ecd

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

lib/Sema/TypeCheckStmt.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -765,10 +765,14 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
765765

766766
// If someone is using an unlabeled break inside of an 'if' or 'do'
767767
// statement, produce a more specific error.
768-
if (S->getTargetName().empty() && !ActiveLabeledStmts.empty() &&
769-
(isa<IfStmt>(ActiveLabeledStmts.back()) ||
770-
isa<DoStmt>(ActiveLabeledStmts.back())))
768+
if (S->getTargetName().empty() &&
769+
std::any_of(ActiveLabeledStmts.rbegin(),
770+
ActiveLabeledStmts.rend(),
771+
[&](Stmt *S) -> bool {
772+
return isa<IfStmt>(S) || isa<DoStmt>(S);
773+
})) {
771774
diagid = diag::unlabeled_break_outside_loop;
775+
}
772776

773777
TC.diagnose(S->getLoc(), diagid);
774778
return nullptr;

test/stmt/statements.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,28 @@ func r25178926(_ a : Type) {
467467
}
468468
}
469469

470+
do {
471+
guard 1 == 2 else {
472+
break // expected-error {{unlabeled 'break' is only allowed inside a loop or switch, a labeled break is required to exit an if or do}}
473+
}
474+
}
475+
476+
func fn(a: Int) {
477+
guard a < 1 else {
478+
break // expected-error {{'break' is only allowed inside a loop, if, do, or switch}}
479+
}
480+
}
481+
482+
func fn(x: Int) {
483+
if x >= 0 {
484+
guard x < 1 else {
485+
guard x < 2 else {
486+
break // expected-error {{unlabeled 'break' is only allowed inside a loop or switch, a labeled break is required to exit an if or do}}
487+
}
488+
return
489+
}
490+
}
491+
}
470492

471493

472494
// Errors in case syntax

0 commit comments

Comments
 (0)