Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision cd1d721883249cecf37cb986c18ac63008f73fc8)
+++ libcfa/src/enum.cfa	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -47,5 +47,5 @@
 //	printf( "N %d\n", N );
 	int r = 0;
-//	for ( s; E : r; 0~@ ) {
+	// for ( s; E : r; 0~@ ) {
 	for ( s; E ) {										// scan string rows gathering lengths
 		lnths[r] = strlen( label( s ) );
@@ -61,4 +61,5 @@
 	for ( c; max ) {									// scan columns of the label matix (some columns missing)
 		int args = fmt( is, "%c", &ch );				// read character
+//		fprintf( stderr, "fmt args: %d eof: %d\n", args, eof(is) );
 	  if ( eof( is ) ) {
 //			fprintf( stderr, "Eof1\n" );
Index: src/ControlStruct/MultiLevelExit.cpp
===================================================================
--- src/ControlStruct/MultiLevelExit.cpp	(revision cd1d721883249cecf37cb986c18ac63008f73fc8)
+++ src/ControlStruct/MultiLevelExit.cpp	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -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 e61289590c1da3e1ab442d87daf577f60847beec)
+++ tests/ctrl-flow/.expect/break-misc.txt	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -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 e61289590c1da3e1ab442d87daf577f60847beec)
+++ tests/ctrl-flow/break-misc.cfa	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -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/enum_tests/.expect/input.txt
===================================================================
--- tests/enum_tests/.expect/input.txt	(revision e61289590c1da3e1ab442d87daf577f60847beec)
+++ tests/enum_tests/.expect/input.txt	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -0,0 +1,39 @@
+"BBB"
+"AB"
+"AAA"
+"AB"
+"BBB"
+"AAA"
+"AB"
+"AA"
+"B"
+"BBB"
+"AAA"
+"AA"
+"AB"
+"B"
+"BBB"
+"AAA"
+"AA"
+"AB"
+"B"
+"AAA"
+"B"
+"CB"
+"AC"
+"CB"
+"AC"
+"BBB"
+"AAA"
+"AA"
+missing data
+"AAA"
+"B"
+"CB"
+"AC"
+"CB"
+"AC"
+"BBB"
+"AAA"
+"AA"
+missing data
Index: tests/enum_tests/.in/input.txt
===================================================================
--- tests/enum_tests/.in/input.txt	(revision e61289590c1da3e1ab442d87daf577f60847beec)
+++ tests/enum_tests/.in/input.txt	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -0,0 +1,12 @@
+BBBABAAAAB
+BBBAAAABAAB
+BBB AAA AA AB B
+BBB
+AAA
+AA
+AB
+B
+AAABCBACCBAC
+BBBAAAAABB
+AAABCBACCBAC
+BBBAAAAABB
Index: tests/enum_tests/input.cfa
===================================================================
--- tests/enum_tests/input.cfa	(revision e61289590c1da3e1ab442d87daf577f60847beec)
+++ tests/enum_tests/input.cfa	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -0,0 +1,18 @@
+#include <fstream.hfa>
+#include <enum.hfa>
+
+int main() {
+	enum(int) E { BBB, AAA, AA, AB, B, CB, AC };
+	E e;
+
+	for () {
+		try {
+			sin | e;
+		} catch( missing_data * ) {
+			sout | "missing data";
+			continue;									// try again
+		} // try
+	  if ( eof( sin ) ) break;
+		sout | "\"" | e | "\"";
+	} // for
+}
Index: tests/exceptions/.expect/try-ctrl-flow.txt
===================================================================
--- tests/exceptions/.expect/try-ctrl-flow.txt	(revision cd1d721883249cecf37cb986c18ac63008f73fc8)
+++ tests/exceptions/.expect/try-ctrl-flow.txt	(revision e61289590c1da3e1ab442d87daf577f60847beec)
@@ -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
