Index: src/SymTab/AddVisit.h
===================================================================
--- src/SymTab/AddVisit.h	(revision 6a57da5334f1340c33beb304ddd8f4b840f1f515)
+++ src/SymTab/AddVisit.h	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 16:14:32 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Jul 14 12:26:17 2015
-// Update Count     : 4
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Apr  7 14:42:21 2016
+// Update Count     : 5
 //
 
@@ -27,37 +27,6 @@
 
 	template< typename Visitor >
-	inline void addVisitStatement( Statement *stmt, Visitor &visitor ) {
-		maybeAccept( stmt, visitor );
-///   if ( ! declsToAdd.empty() ) {
-///     CompoundStmt *compound = new CompoundStmt( noLabels );
-///     compound->get_kids().push_back( stmt );
-///     addDecls( declsToAdd, compound->get_kids(), compound->get_kids().end() );
-///   }
-	}
-
-	template< typename Visitor >
 	inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) {
 		addVisitStatementList( compoundStmt->get_kids(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(IfStmt *ifStmt, Visitor &visitor) {
-		addVisitStatement( ifStmt->get_thenPart(), visitor );
-		addVisitStatement( ifStmt->get_elsePart(), visitor );
-		maybeAccept( ifStmt->get_condition(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(WhileStmt *whileStmt, Visitor &visitor) {
-		addVisitStatement( whileStmt->get_body(), visitor );
-		maybeAccept( whileStmt->get_condition(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(ForStmt *forStmt, Visitor &visitor) {
-		addVisitStatement( forStmt->get_body(), visitor );
-		acceptAll( forStmt->get_initialization(), visitor );
-		maybeAccept( forStmt->get_condition(), visitor );
-		maybeAccept( forStmt->get_increment(), visitor );
 	}
 
@@ -74,15 +43,9 @@
 	}
 
-	template< typename Visitor >
-	inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) {
-		addVisitStatementList( caseStmt->get_statements(), visitor );
-		maybeAccept( caseStmt->get_condition(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(CatchStmt *cathStmt, Visitor &visitor) {
-		addVisitStatement( cathStmt->get_body(), visitor );
-		maybeAccept( cathStmt->get_decl(), visitor );
-	}
+	// template< typename Visitor >
+	// inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) {
+	// 	addVisitStatementList( caseStmt->get_statements(), visitor );
+	// 	maybeAccept( caseStmt->get_condition(), visitor );
+	// }
 } // namespace SymTab
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 6a57da5334f1340c33beb304ddd8f4b840f1f515)
+++ src/SymTab/Validate.cc	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:50:04 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:31:39 2016
-// Update Count     : 226
+// Last Modified On : Thu Apr  7 16:45:30 2016
+// Update Count     : 243
 //
 
@@ -40,8 +40,11 @@
 #include <list>
 #include <iterator>
+#include "Common/utility.h"
+#include "Common/UniqueName.h"
 #include "Validate.h"
 #include "SynTree/Visitor.h"
 #include "SynTree/Mutator.h"
 #include "SynTree/Type.h"
+#include "SynTree/Expression.h"
 #include "SynTree/Statement.h"
 #include "SynTree/TypeSubstitution.h"
@@ -49,6 +52,5 @@
 #include "FixFunction.h"
 // #include "ImplementationType.h"
-#include "Common/utility.h"
-#include "Common/UniqueName.h"
+#include "GenPoly/DeclMutator.h"
 #include "AddVisit.h"
 #include "MakeLibCfa.h"
@@ -70,11 +72,7 @@
 
 		virtual void visit( CompoundStmt *compoundStmt );
-		virtual void visit( IfStmt *ifStmt );
-		virtual void visit( WhileStmt *whileStmt );
-		virtual void visit( ForStmt *forStmt );
 		virtual void visit( SwitchStmt *switchStmt );
 		virtual void visit( ChooseStmt *chooseStmt );
-		virtual void visit( CaseStmt *caseStmt );
-		virtual void visit( CatchStmt *catchStmt );
+		// virtual void visit( CaseStmt *caseStmt );
 	  private:
 		HoistStruct();
@@ -144,11 +142,7 @@
 
 		virtual void visit( CompoundStmt *compoundStmt );
-		virtual void visit( IfStmt *ifStmt );
-		virtual void visit( WhileStmt *whileStmt );
-		virtual void visit( ForStmt *forStmt );
 		virtual void visit( SwitchStmt *switchStmt );
 		virtual void visit( ChooseStmt *chooseStmt );
-		virtual void visit( CaseStmt *caseStmt );
-		virtual void visit( CatchStmt *catchStmt );
+		// virtual void visit( CaseStmt *caseStmt );
 
 		AutogenerateRoutines() : functionNesting( 0 ) {}
@@ -166,5 +160,4 @@
 		/// and return something if the return type is non-void.
 		static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
-
 	  private:
 		virtual void visit( FunctionDecl * functionDecl );
@@ -202,8 +195,17 @@
 	};
 
+	class CompoundLiteral : public GenPoly::DeclMutator {
+		DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass;
+
+		virtual DeclarationWithType * mutate( ObjectDecl *objectDecl );
+		virtual Expression *mutate( CompoundLiteralExpr *compLitExpr );
+	};
+
 	void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
 		Pass1 pass1;
 		Pass2 pass2( doDebug, 0 );
 		Pass3 pass3( 0 );
+		CompoundLiteral compoundliteral;
+
 		EliminateTypedef::eliminateTypedef( translationUnit );
 		HoistStruct::hoistStruct( translationUnit );
@@ -211,4 +213,5 @@
 		acceptAll( translationUnit, pass2 );
 		ReturnChecker::checkFunctionReturns( translationUnit );
+		mutateAll( translationUnit, compoundliteral );
 		AutogenerateRoutines::autogenerateRoutines( translationUnit );
 		acceptAll( translationUnit, pass3 );
@@ -292,16 +295,4 @@
 	}
 
-	void HoistStruct::visit( IfStmt *ifStmt ) {
-		addVisit( ifStmt, *this );
-	}
-
-	void HoistStruct::visit( WhileStmt *whileStmt ) {
-		addVisit( whileStmt, *this );
-	}
-
-	void HoistStruct::visit( ForStmt *forStmt ) {
-		addVisit( forStmt, *this );
-	}
-
 	void HoistStruct::visit( SwitchStmt *switchStmt ) {
 		addVisit( switchStmt, *this );
@@ -312,11 +303,7 @@
 	}
 
-	void HoistStruct::visit( CaseStmt *caseStmt ) {
-		addVisit( caseStmt, *this );
-	}
-
-	void HoistStruct::visit( CatchStmt *cathStmt ) {
-		addVisit( cathStmt, *this );
-	}
+	// void HoistStruct::visit( CaseStmt *caseStmt ) {
+	// 	addVisit( caseStmt, *this );
+	// }
 
 	void Pass1::visit( EnumDecl *enumDecl ) {
@@ -874,16 +861,4 @@
 	}
 
-	void AutogenerateRoutines::visit( IfStmt *ifStmt ) {
-		visitStatement( ifStmt );
-	}
-
-	void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {
-		visitStatement( whileStmt );
-	}
-
-	void AutogenerateRoutines::visit( ForStmt *forStmt ) {
-		visitStatement( forStmt );
-	}
-
 	void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {
 		visitStatement( switchStmt );
@@ -894,11 +869,7 @@
 	}
 
-	void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
-		visitStatement( caseStmt );
-	}
-
-	void AutogenerateRoutines::visit( CatchStmt *cathStmt ) {
-		visitStatement( cathStmt );
-	}
+	// void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
+	// 	visitStatement( caseStmt );
+	// }
 
 	void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) {
@@ -1080,4 +1051,24 @@
 	}
 
+	DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {
+		storageclass = objectDecl->get_storageClass();
+		DeclarationWithType * temp = Mutator::mutate( objectDecl );
+		storageclass = DeclarationNode::NoStorageClass;
+		return temp;
+	}
+
+	Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) {
+		// transform [storage_class] ... (struct S){ 3, ... };
+		// into [storage_class] struct S temp =  { 3, ... };
+		static UniqueName indexName( "_compLit" );
+
+		ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() );
+		compLitExpr->set_type( 0 );
+		compLitExpr->set_initializer( 0 );
+		delete compLitExpr;
+		DeclarationWithType * newtempvar = mutate( tempvar );
+		addDeclaration( newtempvar );					// add modified temporary to current block
+		return new VariableExpr( newtempvar );
+	}
 } // namespace SymTab
 
