Index: src/ControlStruct/LabelFixer.cc
===================================================================
--- src/ControlStruct/LabelFixer.cc	(revision ba3706fcc236a2f6c927dc1a9da14313751a7aa4)
+++ src/ControlStruct/LabelFixer.cc	(revision d16d159c20c0dfd7fa228ef48ab2a37a11be43c6)
@@ -37,21 +37,17 @@
 	}
 
-	void LabelFixer::visit( FunctionDecl *functionDecl ) {
+	void LabelFixer::previsit( FunctionDecl * ) {
 		// need to go into a nested function in a fresh state
-		std::map < Label, Entry *> oldLabelTable = labelTable;
+		GuardValue( labelTable );
 		labelTable.clear();
+	}
 
-		maybeAccept( functionDecl->get_statements(), *this );
-
+	void LabelFixer::postvisit( FunctionDecl * functionDecl ) {
 		MLEMutator mlemut( resolveJumps(), generator );
 		functionDecl->acceptMutator( mlemut );
-
-		// and remember the outer function's labels when
-		// returning to it
-		labelTable = oldLabelTable;
 	}
 
 	// prune to at most one label definition for each statement
-	void LabelFixer::visit( Statement *stmt ) {
+	void LabelFixer::previsit( Statement *stmt ) {
 		std::list< Label > &labels = stmt->get_labels();
 
@@ -62,6 +58,6 @@
 	}
 
-	void LabelFixer::visit( BranchStmt *branchStmt ) {
-		visit ( ( Statement * )branchStmt );
+	void LabelFixer::previsit( BranchStmt *branchStmt ) {
+		previsit( ( Statement *)branchStmt );
 
 		// for labeled branches, add an entry to the label table
@@ -72,15 +68,8 @@
 	}
 
-	void LabelFixer::visit( UntypedExpr *untyped ) {
-		if ( NameExpr * func = dynamic_cast< NameExpr * >( untyped->get_function() ) ) {
-			if ( func->get_name() == "&&" ) {
-				NameExpr * arg = dynamic_cast< NameExpr * >( untyped->get_args().front() );
-				Label target = arg->get_name();
-				assert( target != "" );
-				setLabelsUsg( target, untyped );
-			} else {
-				Visitor::visit( untyped );
-			}
-		}
+	void LabelFixer::previsit( LabelAddressExpr * addrExpr ) {
+		Label & target = addrExpr->arg;
+		assert( target != "" );
+		setLabelsUsg( target, addrExpr );
 	}
 
Index: src/ControlStruct/LabelFixer.h
===================================================================
--- src/ControlStruct/LabelFixer.h	(revision ba3706fcc236a2f6c927dc1a9da14313751a7aa4)
+++ src/ControlStruct/LabelFixer.h	(revision d16d159c20c0dfd7fa228ef48ab2a37a11be43c6)
@@ -19,4 +19,5 @@
 #include <map>                     // for map
 
+#include "Common/PassVisitor.h"
 #include "Common/SemanticError.h"  // for SemanticError
 #include "SynTree/Label.h"         // for Label
@@ -26,8 +27,7 @@
 namespace ControlStruct {
 	/// normalizes label definitions and generates multi-level exit labels
-class LabelGenerator;
+	class LabelGenerator;
 
-	class LabelFixer final : public Visitor {
-		typedef Visitor Parent;
+	class LabelFixer final : public WithGuards {
 	  public:
 		LabelFixer( LabelGenerator *gen = 0 );
@@ -35,26 +35,14 @@
 		std::map < Label, Statement * > *resolveJumps() throw ( SemanticError );
 
-		using Visitor::visit;
-
 		// Declarations
-		virtual void visit( FunctionDecl *functionDecl ) override;
+		void previsit( FunctionDecl *functionDecl );
+		void postvisit( FunctionDecl *functionDecl );
 
 		// Statements
-		void visit( Statement *stmt );
+		void previsit( Statement *stmt );
+		void previsit( BranchStmt *branchStmt );
 
-		virtual void visit( CompoundStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( NullStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( ExprStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( IfStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( WhileStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( ForStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( SwitchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( CaseStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( ReturnStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( TryStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( CatchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( DeclStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( BranchStmt *branchStmt ) override;
-		virtual void visit( UntypedExpr *untyped ) override;
+		// Expressions
+		void previsit( LabelAddressExpr *addrExpr );
 
 		Label setLabelsDef( std::list< Label > &, Statement *definition );
Index: src/ControlStruct/Mutate.cc
===================================================================
--- src/ControlStruct/Mutate.cc	(revision ba3706fcc236a2f6c927dc1a9da14313751a7aa4)
+++ src/ControlStruct/Mutate.cc	(revision d16d159c20c0dfd7fa228ef48ab2a37a11be43c6)
@@ -24,5 +24,4 @@
 #include "SynTree/Declaration.h"   // for Declaration
 #include "SynTree/Mutator.h"       // for mutateAll
-//#include "ExceptMutator.h"
 
 #include "Common/PassVisitor.h"    // for PassVisitor
@@ -37,11 +36,8 @@
 
 		// normalizes label definitions and generates multi-level exit labels
-		LabelFixer lfix;
-
-		//ExceptMutator exc;
+		PassVisitor<LabelFixer> lfix;
 
 		mutateAll( translationUnit, formut );
 		acceptAll( translationUnit, lfix );
-		//mutateAll( translationUnit, exc );
 	}
 } // namespace CodeGen
