Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 2bf9c37a121444757e12034a6a8371e9a5c1f075)
+++ src/SymTab/Indexer.cc	(revision 58094611c386c7e6f0ba52d00ecf89b154288c42)
@@ -398,5 +398,4 @@
 	void Indexer::visit( LabelAddressExpr *labAddressExpr ) {
 		acceptNewScope( labAddressExpr->get_result(), *this );
-		maybeAccept( labAddressExpr->get_arg(), *this );
 	}
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 2bf9c37a121444757e12034a6a8371e9a5c1f075)
+++ src/SymTab/Validate.cc	(revision 58094611c386c7e6f0ba52d00ecf89b154288c42)
@@ -244,4 +244,10 @@
 	};
 
+	struct LabelAddressFixer final : public WithGuards {
+		std::set< Label > labels;
+
+		void premutate( FunctionDecl * funcDecl );
+		Expression * postmutate( AddressExpr * addrExpr );
+	};
 
 	FunctionDecl * dereferenceOperator = nullptr;
@@ -257,4 +263,5 @@
 		PassVisitor<ValidateGenericParameters> genericParams;
 		PassVisitor<FindSpecialDeclarations> finder;
+		PassVisitor<LabelAddressFixer> labelAddrFixer;
 
 		EliminateTypedef::eliminateTypedef( translationUnit );
@@ -274,4 +281,5 @@
 		ArrayLength::computeLength( translationUnit );
 		acceptAll( translationUnit, finder );
+		mutateAll( translationUnit, labelAddrFixer );
 	}
 
@@ -977,4 +985,34 @@
 	}
 
+	struct LabelFinder {
+		std::set< Label > & labels;
+		LabelFinder( std::set< Label > & labels ) : labels( labels ) {}
+		void previsit( Statement * stmt ) {
+			for ( Label & l : stmt->labels ) {
+				labels.insert( l );
+			}
+		}
+	};
+
+	void LabelAddressFixer::premutate( FunctionDecl * funcDecl ) {
+		GuardValue( labels );
+		PassVisitor<LabelFinder> finder( labels );
+		funcDecl->accept( finder );
+	}
+
+	Expression * LabelAddressFixer::postmutate( AddressExpr * addrExpr ) {
+		// convert &&label into label address
+		if ( AddressExpr * inner = dynamic_cast< AddressExpr * >( addrExpr->arg ) ) {
+			if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( inner->arg ) ) {
+				if ( labels.count( nameExpr->name ) ) {
+					Label name = nameExpr->name;
+					delete addrExpr;
+					return new LabelAddressExpr( name );
+				}
+			}
+		}
+		return addrExpr;
+	}
+
 	void FindSpecialDeclarations::previsit( FunctionDecl * funcDecl ) {
 		if ( ! dereferenceOperator ) {
