Index: src/ControlStruct/MultiLevelExit.cpp
===================================================================
--- src/ControlStruct/MultiLevelExit.cpp	(revision 88bc8767b6502fe26936931ac4d52200490e035d)
+++ src/ControlStruct/MultiLevelExit.cpp	(revision 18d7aafd7ba06df826cfd83e2f922f66fd91126b)
@@ -84,4 +84,7 @@
 	bool isFallDefaultTarget() const { return kind == SwitchStmtK; }
 
+	// Check if this entry can be the target of an unlabelled break.
+	bool isUnlabelledBreakTarget() const { return kind <= WhileDoStmtK || kind == SwitchStmtK; }
+
 	// These routines set a target as being "used" by a BranchStmt
 	Label useContExit() { assert( kind <= WhileDoStmtK ); return useTarget(secondTarget); }
@@ -114,4 +117,8 @@
 bool isFallthroughDefaultTarget( const Entry & entry ) {
 	return entry.isFallDefaultTarget();
+}
+
+bool isUnlabelledBreakTarget( const Entry & entry ) {
+	return entry.isUnlabelledBreakTarget();
 }
 
@@ -247,16 +254,19 @@
 	case BranchStmt::Break: {
 		bool isContinue = stmt->kind == BranchStmt::Continue;
-		// Handle unlabeled break and continue.
-		if ( stmt->target.empty() ) {
-			if ( isContinue ) {
-				targetEntry = findEnclosingControlStructure( isContinueTarget );
-			} else {
-				if ( enclosing_control_structures.empty() ) {
-					  SemanticError( stmt->location,
-									 "\"break\" outside a loop, \"switch\", or labelled block" );
-				}
-				targetEntry = findEnclosingControlStructure( isBreakTarget );
+		// Handle unlabeled continue.
+		if ( isContinue && stmt->target.empty() ) {
+			targetEntry = findEnclosingControlStructure( isContinueTarget );
+			if ( targetEntry == enclosing_control_structures.rend() ) {
+				SemanticError( stmt->location,
+				               "\"continue\" outside a loop" );
 			}
-			// Handle labeled break and continue.
+		// Handle unlabeled break.
+		} else if ( stmt->target.empty() ) {
+			targetEntry = findEnclosingControlStructure( isUnlabelledBreakTarget );
+			if ( targetEntry == enclosing_control_structures.rend() ) {
+				SemanticError( stmt->location,
+				               "\"break\" outside a loop or \"switch\"" );
+			}
+		// Handle labeled break and continue.
 		} else {
 			// Lookup label in table to find attached control structure.
@@ -265,10 +275,11 @@
 					  return entry.stmt == targetStmt;
 				} );
-		}
-		// Ensure that selected target is valid.
-		if ( targetEntry == enclosing_control_structures.rend() || ( isContinue && ! isContinueTarget( *targetEntry ) ) ) {
-			SemanticError( stmt->location, toString( (isContinue ? "\"continue\"" : "\"break\""),
-							" target must be an enclosing ", (isContinue ? "loop: " : "control structure: "),
-							stmt->originalTarget ) );
+			// Ensure that selected target is valid.
+			if ( targetEntry == enclosing_control_structures.rend()
+					|| ( isContinue ? !isContinueTarget( *targetEntry ) : !isBreakTarget( *targetEntry ) ) ) {
+				SemanticError( stmt->location, toString( (isContinue ? "\"continue\"" : "\"break\""),
+				               " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "),
+				               stmt->originalTarget ) );
+			}
 		}
 		break;
