Index: src/ControlStruct/MLEMutator.cc
===================================================================
--- src/ControlStruct/MLEMutator.cc	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/ControlStruct/MLEMutator.cc	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  8 17:08:25 2018
-// Update Count     : 219
+// Last Modified On : Thu Aug  4 11:21:32 2016
+// Update Count     : 202
 //
 
@@ -38,33 +38,13 @@
 	}
 	namespace {
-		bool isLoop( const MLEMutator::Entry & e ) { return dynamic_cast< WhileStmt * >( e.get_controlStructure() ) || dynamic_cast< ForStmt * >( e.get_controlStructure() ); }
-		bool isSwitch( const MLEMutator::Entry & e ) { return dynamic_cast< SwitchStmt *>( e.get_controlStructure() ); }
-
-		bool isBreakTarget( const MLEMutator::Entry & e ) { return isLoop( e ) || isSwitch( e ) || dynamic_cast< CompoundStmt *>( e.get_controlStructure() ); }
-		bool isContinueTarget( const MLEMutator::Entry & e ) { return isLoop( e ); }
-		bool isFallthroughTarget( const MLEMutator::Entry & e ) { return dynamic_cast< CaseStmt *>( e.get_controlStructure() );; }
-		bool isFallthroughDefaultTarget( const MLEMutator::Entry & e ) { return isSwitch( e ); }
-	} // namespace
+		Statement * isLoop( Statement * stmt ) { return dynamic_cast< WhileStmt * >( stmt ) ? stmt : dynamic_cast< ForStmt * >( stmt ) ? stmt : 0; }
+	}
 
 	// break labels have to come after the statement they break out of, so mutate a statement, then if they inform us
 	// through the breakLabel field tha they need a place to jump to on a break statement, add the break label to the
 	// body of statements
-	void MLEMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) {
-		SemanticErrorException errors;
-
+	void MLEMutator::fixBlock( std::list< Statement * > &kids ) {
 		for ( std::list< Statement * >::iterator k = kids.begin(); k != kids.end(); k++ ) {
-			if ( caseClause ) {
-				// once a label is seen, it's no longer a valid fallthrough target
-				for ( Label & l : (*k)->labels ) {
-					fallthroughLabels.erase( l );
-				}
-			}
-
-			// aggregate errors since the PassVisitor mutate loop was unrollled
-			try {
-				*k = (*k)->acceptMutator(*visitor);
-			} catch( SemanticErrorException &e ) {
-				errors.append( e );
-			}
+			*k = (*k)->acceptMutator(*visitor);
 
 			if ( ! get_breakLabel().empty() ) {
@@ -75,8 +55,4 @@
 			} // if
 		} // for
-
-		if ( ! errors.isEmpty() ) {
-			throw errors;
-		}
 	}
 
@@ -87,5 +63,4 @@
 			Label brkLabel = generator->newLabel("blockBreak", cmpndStmt);
 			enclosingControlStructures.push_back( Entry( cmpndStmt, brkLabel ) );
-			GuardAction( [this]() { enclosingControlStructures.pop_back(); } );
 		} // if
 
@@ -99,4 +74,5 @@
 				set_breakLabel( enclosingControlStructures.back().useBreakExit() );
 			} // if
+			enclosingControlStructures.pop_back();
 		} // if
 	}
@@ -136,9 +112,9 @@
 					if ( isContinue ) {
 						// continue target is outermost loop
-						targetEntry = std::find_if( enclosingControlStructures.rbegin(), enclosingControlStructures.rend(), isContinueTarget );
+						targetEntry = std::find_if( enclosingControlStructures.rbegin(), enclosingControlStructures.rend(), [](Entry &e) { return isLoop( e.get_controlStructure() ); } );
 					} else {
-						// break target is outermost loop, switch, or block control structure
-						if ( enclosingControlStructures.empty() ) SemanticError( branchStmt->location, "'break' outside a loop, 'switch', or labelled block" );
-						targetEntry = std::find_if( enclosingControlStructures.rbegin(), enclosingControlStructures.rend(), isBreakTarget );
+						// break target is outmost control structure
+						if ( enclosingControlStructures.empty() ) SemanticError( branchStmt->location, "'break' outside a loop, switch, or labelled block" );
+						targetEntry = enclosingControlStructures.rbegin();
 					} // if
 				} else {
@@ -147,48 +123,9 @@
 				} // if
 				// ensure that selected target is valid
-				if ( targetEntry == enclosingControlStructures.rend() || (isContinue && ! isContinueTarget( *targetEntry ) ) ) {
+				if ( targetEntry == enclosingControlStructures.rend() || (isContinue && ! isLoop( targetEntry->get_controlStructure() ) ) ) {
 					SemanticError( branchStmt->location, toString( (isContinue ? "'continue'" : "'break'"), " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "), originalTarget ) );
 				} // if
 				break;
 			}
-			case BranchStmt::FallThrough:
-				targetEntry = std::find_if( enclosingControlStructures.rbegin(), enclosingControlStructures.rend(), isFallthroughTarget );
-				// ensure that selected target is valid
-				if ( targetEntry == enclosingControlStructures.rend() ) {
-					SemanticError( branchStmt->location, "'fallthrough' must be enclosed in a 'switch' or 'choose'" );
-				} // if
-				if ( branchStmt->get_target() != "" ) {
-					// labelled fallthrough
-					// target must be in the set of valid fallthrough labels
-					if ( ! fallthroughLabels.count( branchStmt->get_target() ) ) {
-						SemanticError( branchStmt->location, toString( "'fallthrough' target must be a later case statement: ", originalTarget ) );
-					}
-					return new BranchStmt( originalTarget, BranchStmt::Goto );
-				}
-				break;
-			case BranchStmt::FallThroughDefault: {
-				// fallthrough default
-				targetEntry = std::find_if( enclosingControlStructures.rbegin(), enclosingControlStructures.rend(), isFallthroughDefaultTarget );
-
-				// ensure that fallthrough is within a switch or choose
-				if ( targetEntry == enclosingControlStructures.rend() ) {
-					SemanticError( branchStmt->location, "'fallthrough' must be enclosed in a 'switch' or 'choose'" );
-				} // if
-
-				// ensure that switch or choose has a default clause
-				SwitchStmt * switchStmt = strict_dynamic_cast< SwitchStmt * >( targetEntry->get_controlStructure() );
-				bool foundDefault = false;
-				for ( Statement * stmt : switchStmt->statements ) {
-					CaseStmt * caseStmt = strict_dynamic_cast< CaseStmt * >( stmt );
-					if ( caseStmt->isDefault() ) {
-						foundDefault = true;
-					} // if
-				} // for
-				if ( ! foundDefault ) {
-					SemanticError( branchStmt->location, "'fallthrough default' must be enclosed in a 'switch' or 'choose' control structure with a 'default' clause" );
-				}
-				break;
-			}
-
 			default:
 				assert( false );
@@ -206,16 +143,4 @@
 				exitLabel = targetEntry->useContExit();
 				break;
-		  case BranchStmt::FallThrough:
-				assert( targetEntry->useFallExit() != "");
-				exitLabel = targetEntry->useFallExit();
-				break;
-		  case BranchStmt::FallThroughDefault:
-				assert( targetEntry->useFallDefaultExit() != "");
-				exitLabel = targetEntry->useFallDefaultExit();
-				// check that fallthrough default comes before the default clause
-				if ( ! targetEntry->isFallDefaultValid() ) {
-					SemanticError( branchStmt->location, "'fallthrough default' must precede the 'default' clause" );
-				}
-				break;
 		  default:
 				assert(0);					// shouldn't be here
@@ -262,5 +187,4 @@
 		Label contLabel = generator->newLabel("loopContinue", loopStmt);
 		enclosingControlStructures.push_back( Entry( loopStmt, brkLabel, contLabel ) );
-		GuardAction( [this]() { enclosingControlStructures.pop_back(); } );
 	}
 
@@ -273,5 +197,6 @@
 
 		// this will take the necessary steps to add definitions of the previous two labels, if they are used.
-		loopStmt->body = mutateLoop( loopStmt->get_body(), e );
+		loopStmt->set_body( mutateLoop( loopStmt->get_body(), e ) );
+		enclosingControlStructures.pop_back();
 		return loopStmt;
 	}
@@ -299,5 +224,4 @@
 			Label brkLabel = generator->newLabel("blockBreak", ifStmt);
 			enclosingControlStructures.push_back( Entry( ifStmt, brkLabel ) );
-			GuardAction( [this]() { enclosingControlStructures.pop_back(); } );
 		} // if
 	}
@@ -309,4 +233,5 @@
 				set_breakLabel( enclosingControlStructures.back().useBreakExit() );
 			} // if
+			enclosingControlStructures.pop_back();
 		} // if
 		return ifStmt;
@@ -315,39 +240,6 @@
 	void MLEMutator::premutate( CaseStmt *caseStmt ) {
 		visit_children = false;
-
-		// mark default as seen before visiting its statements to catch default loops
-		if ( caseStmt->isDefault() ) {
-			enclosingControlStructures.back().seenDefault();
-		} // if
-
 		caseStmt->condition = maybeMutate( caseStmt->condition, *visitor );
-		Label fallLabel = generator->newLabel( "fallThrough", caseStmt );
-		{
-			// ensure that stack isn't corrupted by exceptions in fixBlock
-			auto guard = makeFuncGuard( [&]() { enclosingControlStructures.push_back( Entry( caseStmt, fallLabel ) ); }, [this]() { enclosingControlStructures.pop_back(); } );
-
-			// empty case statement
-			if( ! caseStmt->stmts.empty() ) {
-				// the parser ensures that all statements in a case are grouped into a block
-				CompoundStmt * block = strict_dynamic_cast< CompoundStmt * >( caseStmt->stmts.front() );
-				fixBlock( block->kids, true );
-
-				// add fallthrough label if necessary
-				assert( ! enclosingControlStructures.empty() );
-				if ( enclosingControlStructures.back().isFallUsed() ) {
-					std::list<Label> ls{ enclosingControlStructures.back().useFallExit() };
-					caseStmt->stmts.push_back( new NullStmt( ls ) );
-				} // if
-			} // if
-		}
-		assert( ! enclosingControlStructures.empty() );
-		assertf( dynamic_cast<SwitchStmt *>( enclosingControlStructures.back().get_controlStructure() ), "Control structure enclosing a case clause must be a switch, but is: %s", toCString( enclosingControlStructures.back().get_controlStructure() ) );
-		if ( caseStmt->isDefault() ) {
-			if ( enclosingControlStructures.back().isFallDefaultUsed() ) {
-				// add fallthrough default label if necessary
-				std::list<Label> ls{ enclosingControlStructures.back().useFallDefaultExit() };
-				caseStmt->stmts.push_front( new NullStmt( ls ) );
-			} // if
-		} // if
+		fixBlock( caseStmt->stmts );
 	}
 
@@ -355,25 +247,5 @@
 		// generate a label for breaking out of a labeled switch
 		Label brkLabel = generator->newLabel("switchBreak", switchStmt);
-		auto it = std::find_if( switchStmt->statements.rbegin(), switchStmt->statements.rend(), [](Statement * stmt) {
-			CaseStmt * caseStmt = strict_dynamic_cast< CaseStmt * >( stmt );
-			return caseStmt->isDefault();
-		});
-		CaseStmt * defaultCase = it != switchStmt->statements.rend() ? strict_dynamic_cast<CaseStmt *>( *it ) : nullptr;
-		Label fallDefaultLabel = defaultCase ? generator->newLabel( "fallThroughDefault", defaultCase ) : "";
-		enclosingControlStructures.push_back( Entry(switchStmt, brkLabel, fallDefaultLabel) );
-		GuardAction( [this]() { enclosingControlStructures.pop_back(); } );
-
-		// Collect valid labels for fallthrough. This is initially all labels at the same level as a case statement.
-		// As labels are seen during traversal, they are removed, since fallthrough is not allowed to jump backwards.
-		for ( Statement * stmt : switchStmt->statements ) {
-			CaseStmt * caseStmt = strict_dynamic_cast< CaseStmt * >( stmt );
-			if ( caseStmt->stmts.empty() ) continue;
-			CompoundStmt * block = dynamic_cast< CompoundStmt * >( caseStmt->stmts.front() );
-			for ( Statement * stmt : block->kids ) {
-				for ( Label & l : stmt->labels ) {
-					fallthroughLabels.insert( l );
-				}
-			}
-		}
+		enclosingControlStructures.push_back( Entry(switchStmt, brkLabel) );
 	}
 
@@ -400,4 +272,5 @@
 
 		assert ( enclosingControlStructures.back() == switchStmt );
+		enclosingControlStructures.pop_back();
 		return switchStmt;
 	}
Index: src/ControlStruct/MLEMutator.h
===================================================================
--- src/ControlStruct/MLEMutator.h	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/ControlStruct/MLEMutator.h	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  8 16:42:32 2018
-// Update Count     : 41
+// Last Modified On : Sat Jul 22 09:19:59 2017
+// Update Count     : 35
 //
 
@@ -19,5 +19,4 @@
 #include <map>                     // for map
 #include <string>                  // for string
-#include <set>                     // for unordered_set
 
 #include "Common/PassVisitor.h"
@@ -30,7 +29,8 @@
 	class LabelGenerator;
 
-	class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards {
+	class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting {
+		class Entry;
+
 	  public:
-		class Entry;
 		MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
 		~MLEMutator();
@@ -52,54 +52,29 @@
 		Label &get_breakLabel() { return breakLabel; }
 		void set_breakLabel( Label newValue ) { breakLabel = newValue; }
-
+	  private:
 		class Entry {
 		  public:
-			// specialized constructors for each combination of statement with labelled break/continue/fallthrough that is valid to cleanup the use cases
-			explicit Entry( ForStmt *stmt, Label breakExit, Label contExit ) :
-				stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {}
+			explicit Entry( Statement *_loop, Label _breakExit, Label _contExit = Label("") ) :
+				loop( _loop ), breakExit( _breakExit ), contExit( _contExit ), breakUsed(false), contUsed(false) {}
 
-			explicit Entry( WhileStmt *stmt, Label breakExit, Label contExit ) :
-				stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {}
+			bool operator==( const Statement *stmt ) { return loop == stmt; }
+			bool operator!=( const Statement *stmt ) { return loop != stmt; }
 
-			explicit Entry( CompoundStmt *stmt, Label breakExit ) :
-				stmt( stmt ), breakExit( breakExit ) {}
+			bool operator==( const Entry &other ) { return loop == other.get_controlStructure(); }
 
-			explicit Entry( IfStmt *stmt, Label breakExit ) :
-				stmt( stmt ), breakExit( breakExit ) {}
-
-			explicit Entry( CaseStmt *stmt, Label fallExit ) :
-				stmt( stmt ), fallExit( fallExit ) {}
-
-			explicit Entry( SwitchStmt *stmt, Label breakExit, Label fallDefaultExit ) :
-				stmt( stmt ), breakExit( breakExit ), fallDefaultExit( fallDefaultExit ) {}
-
-			bool operator==( const Statement *other ) { return stmt == other; }
-			bool operator!=( const Statement *other ) { return stmt != other; }
-
-			bool operator==( const Entry &other ) { return stmt == other.get_controlStructure(); }
-
-			Statement *get_controlStructure() const { return stmt; }
+			Statement *get_controlStructure() const { return loop; }
 
 			Label useContExit() { contUsed = true; return contExit; }
 			Label useBreakExit() { breakUsed = true; return breakExit; }
-			Label useFallExit() { fallUsed = true; return fallExit; }
-			Label useFallDefaultExit() { fallDefaultUsed = true; return fallDefaultExit; }
 
 			bool isContUsed() const { return contUsed; }
 			bool isBreakUsed() const { return breakUsed; }
-			bool isFallUsed() const { return fallUsed; }
-			bool isFallDefaultUsed() const { return fallDefaultUsed; }
-			void seenDefault() { fallDefaultValid = false; }
-			bool isFallDefaultValid() const { return fallDefaultValid; }
 		  private:
-			Statement *stmt;
-			Label breakExit, contExit, fallExit, fallDefaultExit;
-			bool breakUsed = false, contUsed = false, fallUsed = false, fallDefaultUsed = false;
-			bool fallDefaultValid = true;
+			Statement *loop;
+			Label breakExit, contExit;
+			bool breakUsed, contUsed;
 		};
 
-	  private:
 		std::map< Label, Statement * > *targetTable;
-		std::set< Label > fallthroughLabels;
 		std::list< Entry > enclosingControlStructures;
 		Label breakLabel;
@@ -112,5 +87,5 @@
 		Statement * posthandleLoopStmt( LoopClass * loopStmt );
 
-		void fixBlock( std::list< Statement * > &kids, bool caseClause = false );
+		void fixBlock( std::list< Statement * > &kids );
 	};
 } // namespace ControlStruct
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/Parser/ParseNode.h	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -392,5 +392,5 @@
 
 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt );
-Statement * build_switch( bool isSwitch, ExpressionNode * ctl, StatementNode * stmt );
+Statement * build_switch( ExpressionNode * ctl, StatementNode * stmt );
 Statement * build_case( ExpressionNode * ctl );
 Statement * build_default();
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/Parser/StatementNode.cc	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  8 14:31:32 2018
-// Update Count     : 348
+// Last Modified On : Fri Sep  1 23:25:23 2017
+// Update Count     : 346
 //
 
@@ -116,16 +116,7 @@
 }
 
-Statement *build_switch( bool isSwitch, ExpressionNode *ctl, StatementNode *stmt ) {
+Statement *build_switch( ExpressionNode *ctl, StatementNode *stmt ) {
 	std::list< Statement * > branches;
 	buildMoveList< Statement, StatementNode >( stmt, branches );
-	if ( ! isSwitch ) {										// choose statement
-		for ( Statement * stmt : branches ) {
-			CaseStmt * caseStmt = strict_dynamic_cast< CaseStmt * >( stmt );
-			if ( ! caseStmt->stmts.empty() ) {			// code after "case" => end of case list
-				CompoundStmt * block = strict_dynamic_cast< CompoundStmt * >( caseStmt->stmts.front() );
-				block->kids.push_back( new BranchStmt( "", BranchStmt::Break ) );
-			} // if
-		} // for
-	} // if
 	// branches.size() == 0 for switch (...) {}, i.e., no declaration or statements
 	return new SwitchStmt( maybeMoveBuild< Expression >(ctl), branches );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/Parser/parser.yy	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar  9 11:37:35 2018
-// Update Count     : 3075
+// Last Modified On : Thu Feb 22 17:48:54 2018
+// Update Count     : 3028
 //
 
@@ -254,7 +254,8 @@
 %type<sn> statement_decl				statement_decl_list			statement_list_nodecl
 %type<sn> selection_statement
-%type<sn> switch_clause_list_opt		switch_clause_list
+%type<sn> switch_clause_list_opt		switch_clause_list			choose_clause_list_opt		choose_clause_list
 %type<en> case_value
 %type<sn> case_clause					case_value_list				case_label					case_label_list
+%type<sn> fall_through					fall_through_opt
 %type<sn> iteration_statement			jump_statement
 %type<sn> expression_statement			asm_statement
@@ -916,8 +917,8 @@
 		{ $$ = new StatementNode( build_if( $4, $6, $8 ) ); }
 	| SWITCH '(' comma_expression ')' case_clause
-		{ $$ = new StatementNode( build_switch( true, $3, $5 ) ); }
+		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
 	| SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
 		{
-			StatementNode *sw = new StatementNode( build_switch( true, $3, $8 ) );
+			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
 			// The semantics of the declaration list is changed to include associated initialization, which is performed
 			// *before* the transfer to the appropriate case clause by hoisting the declarations into a compound
@@ -928,8 +929,8 @@
 		}
 	| CHOOSE '(' comma_expression ')' case_clause		// CFA
-		{ $$ = new StatementNode( build_switch( false, $3, $5 ) ); }
-	| CHOOSE '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
-		{
-			StatementNode *sw = new StatementNode( build_switch( false, $3, $8 ) );
+		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
+	| CHOOSE '(' comma_expression ')' '{' push declaration_list_opt choose_clause_list_opt '}' // CFA
+		{
+			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
 			$$ = $7 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw;
 		}
@@ -969,10 +970,4 @@
 	;
 
-//label_list_opt:
-//	// empty
-//	| identifier_or_type_name ':'
-//	| label_list_opt identifier_or_type_name ':'
-//	;
-
 case_label_list:										// CFA
 	case_label
@@ -995,4 +990,39 @@
 	| switch_clause_list case_label_list statement_list_nodecl
 		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); }
+	;
+
+choose_clause_list_opt:									// CFA
+	// empty
+		{ $$ = nullptr; }
+	| choose_clause_list
+	;
+
+choose_clause_list:										// CFA
+	case_label_list fall_through
+		{ $$ = $1->append_last_case( $2 ); }
+	| case_label_list statement_list_nodecl fall_through_opt
+		{ $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); }
+	| choose_clause_list case_label_list fall_through
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
+	| choose_clause_list case_label_list statement_list_nodecl fall_through_opt
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); }
+	;
+
+fall_through_opt:										// CFA
+	// empty
+		{ $$ = new StatementNode( build_branch( BranchStmt::Break ) ); } // insert implicit break
+	| fall_through
+	;
+
+fall_through_name:										// CFA
+	FALLTHRU
+	| FALLTHROUGH
+	;
+
+fall_through:											// CFA
+	fall_through_name
+		{ $$ = nullptr; }
+	| fall_through_name ';'
+		{ $$ = nullptr; }
 	;
 
@@ -1020,11 +1050,4 @@
 		// whereas normal operator precedence yields goto (*i)+3;
 		{ $$ = new StatementNode( build_computedgoto( $3 ) ); }
-		// A semantic check is required to ensure fallthru appears only in the body of a choose statement.
-    | fall_through_name ';'								// CFA
-		{ $$ = new StatementNode( build_branch( BranchStmt::FallThrough ) ); }
-    | fall_through_name identifier_or_type_name ';'		// CFA
-		{ $$ = new StatementNode( build_branch( $2, BranchStmt::FallThrough ) ); }
-	| fall_through_name DEFAULT ';'						// CFA
-		{ $$ = new StatementNode( build_branch( BranchStmt::FallThroughDefault ) ); }
 	| CONTINUE ';'
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement.
@@ -1053,9 +1076,4 @@
 	;
 
-fall_through_name:										// CFA
-	FALLTHRU
-	| FALLTHROUGH
-	;
-
 with_statement:
 	WITH '(' tuple_expression_list ')' statement
@@ -1072,5 +1090,6 @@
 
 when_clause:
-	WHEN '(' comma_expression ')'				{ $$ = $3; }
+	WHEN '(' comma_expression ')'
+		{ $$ = $3; }
 	;
 
@@ -1096,5 +1115,6 @@
 
 timeout:
-	TIMEOUT '(' comma_expression ')'	 		{ $$ = $3; }
+	TIMEOUT '(' comma_expression ')'
+ 		{ $$ = $3; }
 	;
 
@@ -1139,14 +1159,20 @@
 	//empty
 		{ $$ = nullptr; }
-	| ';' conditional_expression				{ $$ = $2; }
+	| ';' conditional_expression
+		{ $$ = $2; }
 	;
 
 handler_key:
-	CATCH										{ $$ = CatchStmt::Terminate; }
-	| CATCHRESUME								{ $$ = CatchStmt::Resume; }
+	CATCH
+		{ $$ = CatchStmt::Terminate; }
+	| CATCHRESUME
+		{ $$ = CatchStmt::Resume; }
 	;
 
 finally_clause:
-	FINALLY compound_statement					{ $$ = new StatementNode( build_finally( $2 ) ); }
+	FINALLY compound_statement
+		{
+			$$ = new StatementNode( build_finally( $2 ) );
+		}
 	;
 
@@ -2387,5 +2413,5 @@
 			$$ = $2;
 		}
-	| type_qualifier_list '{' external_definition_list '}'			// CFA, namespace
+	| forall '{' external_definition_list '}'			// CFA, namespace
 	;
 
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/SynTree/Statement.cc	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -34,7 +34,7 @@
 Statement::Statement( const std::list<Label> & labels ) : labels( labels ) {}
 
-void Statement::print( std::ostream & os, Indenter indent ) const {
+void Statement::print( std::ostream & os, Indenter ) const {
 	if ( ! labels.empty() ) {
-		os << indent << "... Labels: {";
+		os << "Labels: {";
 		for ( const Label & l : labels ) {
 			os << l << ",";
@@ -223,7 +223,7 @@
 
 void CaseStmt::print( std::ostream &os, Indenter indent ) const {
-	if ( isDefault() ) os << indent << "Default ";
+	if ( isDefault() ) os << "Default ";
 	else {
-		os << indent << "Case ";
+		os << "Case ";
 		condition->print( os, indent );
 	} // if
@@ -231,5 +231,4 @@
 
 	for ( Statement * stmt : stmts ) {
-		os << indent+1;
 		stmt->print( os, indent+1 );
 	}
@@ -479,7 +478,6 @@
 }
 
-void NullStmt::print( std::ostream &os, Indenter indent ) const {
+void NullStmt::print( std::ostream &os, Indenter ) const {
 	os << "Null Statement" << endl;
-	Statement::print( os, indent );
 }
 
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/SynTree/Statement.h	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  8 14:53:02 2018
-// Update Count     : 78
+// Last Modified On : Sun Sep  3 20:46:46 2017
+// Update Count     : 77
 //
 
@@ -255,5 +255,5 @@
 class BranchStmt : public Statement {
   public:
-	enum Type { Goto = 0, Break, Continue, FallThrough, FallThroughDefault };
+	enum Type { Goto = 0, Break, Continue };
 
 	// originalTarget kept for error messages.
Index: c/tests/.expect/fallthrough-ERROR.txt
===================================================================
--- src/tests/.expect/fallthrough-ERROR.txt	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ 	(revision )
@@ -1,7 +1,0 @@
-fallthrough.c:54:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
-fallthrough.c:56:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
-fallthrough.c:58:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
-fallthrough.c:65:1 error: 'fallthrough default' must be directly enclosed in a 'switch' or 'choose' control structure with a 'default' clause
-fallthrough.c:67:1 error: 'fallthrough' target must be a later case statement: common3
-fallthrough.c:75:1 error: 'fallthrough' target must be a later case statement: common4
-fallthrough.c:77:1 error: 'fallthrough default' must precede the 'default' clause
Index: c/tests/.expect/fallthrough.txt
===================================================================
--- src/tests/.expect/fallthrough.txt	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ 	(revision )
@@ -1,6 +1,0 @@
-case 1
-case 2
-case 3
-default
-case 5
-common2
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/tests/Makefile.am	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -110,7 +110,4 @@
 	${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
 
-fallthrough-ERROR: fallthrough.c @CFA_BINDIR@/@CFA_NAME@
-	${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
-
 # Constructor/destructor tests
 raii/dtor-early-exit-ERR1: raii/dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ src/tests/Makefile.in	(revision 3fd3bda281e9d17219e179e725018410cd73629a)
@@ -787,7 +787,4 @@
 	${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
 
-fallthrough-ERROR: fallthrough.c @CFA_BINDIR@/@CFA_NAME@
-	${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
-
 # Constructor/destructor tests
 raii/dtor-early-exit-ERR1: raii/dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@
Index: c/tests/fallthrough.c
===================================================================
--- src/tests/fallthrough.c	(revision 753f13c930f795842ec85427aca29f1c29839aee)
+++ 	(revision )
@@ -1,90 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// fallthrough.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Wed Mar 14 10:06:25 2018
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Mar 14 10:32:12 2018
-// Update Count     : 2
-//
-
-void test(int choice) {
-	choose ( choice ) {
-		case 1:
-			printf("case 1\n");
-			fallthru;
-		case 2:
-			printf("case 2\n");
-			fallthru;
-			printf("did not fallthru\n");
-			if ( 7 ) fallthru common2;
-			fallthru common1;
-		case 3:
-			printf("case 3\n");
-			fallthru default;
-			fallthru common1;
-		common1:
-			printf("common1\n");
-		/* break */
-		case 4:
-			printf("case 4\n");
-			fallthru common2;
-		case 5:
-			printf("case 5\n");
-			fallthru common2;
-			fallthru default;
-		case 6:
-			printf("case 6\n");
-			fallthru common2;
-		common2:
-			printf("common2\n");
-		/* break */
-		default:
-			printf("default\n");
-			fallthru;
-	}
-
-#if ERR1
-	// ERROR: fallthrough must be enclosed in switch or choose
-	fallthru;
-	// ERROR: fallthrough must be enclosed in switch or choose
-	fallthru common4;
-	// ERROR: fallthrough must be enclosed in switch or choose
-	fallthru default;
-	choose ( 3 ) {
-		case 2:
-			for ( ;; ) {
-				choose ( 2 ) {
-					case 1:
-						// ERROR: default is later, but in a different switch
-						fallthru default;
-						// ERROR: common3 is later, but not at the same level as a case clause
-						fallthru common3;
-				}
-				common3: ;
-			}
-		default:
-		case 1:
-		common4:
-			// ERROR: attempt to jump up with fallthrough
-			if ( 7 ) fallthru common4;
-			// ERROR: attempt to jump up with fallthrough
-			fallthru default;
-	}
-#endif
-}
-
-int main() {
-	test(1);
-	test(5);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa dtor-early-exit" //
-// End: //
