Index: src/ControlStruct/MultiLevelExit.cpp
===================================================================
--- src/ControlStruct/MultiLevelExit.cpp	(revision 6804f38091a2eedaee8c7ac1a8f71a05e96b6d6d)
+++ src/ControlStruct/MultiLevelExit.cpp	(revision c248b39bb4692247b9aeda9dc3201a9132c577c5)
@@ -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;
Index: tests/ctrl-flow/.expect/break-misc.txt
===================================================================
--- tests/ctrl-flow/.expect/break-misc.txt	(revision c248b39bb4692247b9aeda9dc3201a9132c577c5)
+++ tests/ctrl-flow/.expect/break-misc.txt	(revision c248b39bb4692247b9aeda9dc3201a9132c577c5)
@@ -0,0 +1,4 @@
+if end
+block end
+
+unlabelled loop end
Index: tests/ctrl-flow/break-misc.cfa
===================================================================
--- tests/ctrl-flow/break-misc.cfa	(revision c248b39bb4692247b9aeda9dc3201a9132c577c5)
+++ tests/ctrl-flow/break-misc.cfa	(revision c248b39bb4692247b9aeda9dc3201a9132c577c5)
@@ -0,0 +1,41 @@
+// Test breaking to unusual (non-loop, non-switch) statements.
+
+#include <fstream.hfa>
+
+void breakTargetLabels() {
+	sout | "if";
+	Lif: if ( true ) {
+		break Lif;
+		sout | "!";
+	}
+	sout | "end" | nl;
+
+	sout | "block";
+	Lblock: {
+		break Lblock;
+		sout | "!";
+	}
+	sout | "end" | nl;
+}
+
+void breakSkipsUnlabelled() {
+	sout | "unlabelled";
+	for (int i = 0 ; i < 2 ; ++i) {
+		sout | "loop";
+		block: {
+			break;
+			sout | "!";
+			// Prevent unused label warning.
+			if ( false ) break block;
+		}
+	}
+	sout | "end" | nl;
+}
+
+int main() {
+	sout | nlOff;
+
+	breakTargetLabels();
+	sout | nl;
+	breakSkipsUnlabelled();
+}
Index: tests/exceptions/.expect/try-ctrl-flow.txt
===================================================================
--- tests/exceptions/.expect/try-ctrl-flow.txt	(revision 6804f38091a2eedaee8c7ac1a8f71a05e96b6d6d)
+++ tests/exceptions/.expect/try-ctrl-flow.txt	(revision c248b39bb4692247b9aeda9dc3201a9132c577c5)
@@ -1,10 +1,10 @@
-exceptions/try-ctrl-flow.cfa:7:1 error: "break" outside a loop, "switch", or labelled block
-exceptions/try-ctrl-flow.cfa:15:1 error: "break" outside a loop, "switch", or labelled block
-exceptions/try-ctrl-flow.cfa:23:1 error: "break" outside a loop, "switch", or labelled block
-exceptions/try-ctrl-flow.cfa:31:1 error: "continue" target must be an enclosing loop: 
+exceptions/try-ctrl-flow.cfa:7:1 error: "break" outside a loop or "switch"
+exceptions/try-ctrl-flow.cfa:15:1 error: "break" outside a loop or "switch"
+exceptions/try-ctrl-flow.cfa:23:1 error: "break" outside a loop or "switch"
+exceptions/try-ctrl-flow.cfa:31:1 error: "continue" outside a loop
 exceptions/try-ctrl-flow.cfa:48:1 error: "break" target must be an enclosing control structure: mainLoop
 exceptions/try-ctrl-flow.cfa:56:1 error: "continue" target must be an enclosing loop: mainLoop
-exceptions/try-ctrl-flow.cfa:65:1 error: "break" outside a loop, "switch", or labelled block
-exceptions/try-ctrl-flow.cfa:76:1 error: "break" outside a loop, "switch", or labelled block
+exceptions/try-ctrl-flow.cfa:65:1 error: "break" outside a loop or "switch"
+exceptions/try-ctrl-flow.cfa:76:1 error: "break" outside a loop or "switch"
 exceptions/try-ctrl-flow.cfa:87:1 error: "fallthrough" must be enclosed in a "switch" or "choose"
 exceptions/try-ctrl-flow.cfa:98:1 error: "break" target must be an enclosing control structure: mainBlock
@@ -13,5 +13,5 @@
 exceptions/try-ctrl-flow.cfa:133:1 error: "return" may not appear in a finally clause
 exceptions/try-ctrl-flow.cfa:139:1 error: "return" may not appear in a finally clause
-exceptions/try-ctrl-flow.cfa:148:1 error: "break" outside a loop, "switch", or labelled block
+exceptions/try-ctrl-flow.cfa:148:1 error: "break" outside a loop or "switch"
 exceptions/try-ctrl-flow.cfa:159:1 error: "return" may not appear in a try statement with a catch clause
 exceptions/try-ctrl-flow.cfa:187:1 error: "return" may not appear in a catchResume clause
