Index: src/ControlStruct/LabelFixer.cc
===================================================================
--- src/ControlStruct/LabelFixer.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
+++ src/ControlStruct/LabelFixer.cc	(revision 1869adf4f0d1d49e336dd8261e524773d7d9c864)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 23 12:42:23 2015
-// Update Count     : 96
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 24 16:24:34 2015
+// Update Count     : 141
 //
 
@@ -19,4 +19,5 @@
 #include "LabelFixer.h"
 #include "MLEMutator.h"
+#include "SynTree/Expression.h"
 #include "SynTree/Statement.h"
 #include "SynTree/Declaration.h"
@@ -26,8 +27,18 @@
 
 namespace ControlStruct {
-	LabelFixer::Entry::Entry( Statement *to, BranchStmt *from ) : definition ( to ) {
-		if ( from != 0 )
-			usage.push_back( from );
-	}
+	LabelFixer::Entry::Entry( Statement *to, Statement *from ) : definition ( to ) {
+		if ( from != 0 ) {
+			UsageLoc loc; loc.stmt = from;
+			usage.push_back( loc );
+		}
+	}
+
+	LabelFixer::Entry::Entry( Statement *to, Expression *from ) : definition ( to ) {
+		if ( from != 0 ) {
+			UsageLoc loc; loc.expr = from;
+			usage.push_back( loc );
+		}
+	}
+
 
 	bool LabelFixer::Entry::insideLoop() {
@@ -36,4 +47,12 @@
 	}
 
+	void LabelFixer::Entry::UsageLoc::accept( Visitor & visitor ) {
+		if ( dynamic_cast< Statement * >( stmt ) ) {
+			stmt->accept( visitor );
+		} else {
+			expr->accept( visitor );
+		}
+	}
+
 	LabelFixer::LabelFixer( LabelGenerator *gen ) : generator ( gen ) {
 		if ( generator == 0 )
@@ -50,4 +69,5 @@
 	// prune to at most one label definition for each statement
 	void LabelFixer::visit( Statement *stmt ) {
+		currentStatement = stmt;
 		std::list< Label > &labels = stmt->get_labels();
 
@@ -69,4 +89,18 @@
 		}
 	}
+
+	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 );
+			}
+		}
+	}
+
 
 	// sets the definition of the labelTable entry to be the provided 
@@ -89,5 +123,5 @@
 				// used previously, but undefined until now -> link with this entry
 				Entry * oldEntry = labelTable[ *i ];
-				e->add_uses( oldEntry->get_uses() );
+				e->add_uses( *oldEntry );
 				labelTable[ *i ] = e;
 			} // if
@@ -100,5 +134,6 @@
 
 	// Remember all uses of a label.
-	void LabelFixer::setLabelsUsg( Label orgValue, BranchStmt *use ) {
+	template< typename UsageNode >
+	void LabelFixer::setLabelsUsg( Label orgValue, UsageNode *use ) {
 		assert( use != 0 );
 
@@ -111,4 +146,46 @@
 	}
 
+	class LabelGetter : public Visitor {
+		public:
+		LabelGetter( Label &label ) : label( label ) {}
+
+		virtual void visit( BranchStmt * branchStmt ) {
+			label = branchStmt->get_target();
+		}
+
+		virtual void visit( UntypedExpr * untyped ) {
+			NameExpr * name = dynamic_cast< NameExpr * >( untyped->get_function() );
+			assert( name );
+			assert( name->get_name() == "&&" );
+			NameExpr * arg = dynamic_cast< NameExpr * >( untyped->get_args().front() );
+			assert( arg );
+			label = arg->get_name();
+		}		
+
+		private:
+			Label &label;
+	};
+
+	class LabelSetter : public Visitor {
+		public:
+		LabelSetter( Label label ) : label( label ) {}
+
+		virtual void visit( BranchStmt * branchStmt ) {
+			branchStmt->set_target( label );
+		}
+
+		virtual void visit( UntypedExpr * untyped ) {
+			NameExpr * name = dynamic_cast< NameExpr * >( untyped->get_function() );
+			assert( name );
+			assert( name->get_name() == "&&" );
+			NameExpr * arg = dynamic_cast< NameExpr * >( untyped->get_args().front() );
+			assert( arg );
+			arg->set_name( label );
+		}
+
+	private:
+		Label label;
+	};
+
 	// Ultimately builds a table that maps a label to its defining statement.
 	// In the process, 
@@ -121,7 +198,7 @@
 
 			if ( def_us.find ( e->get_definition() ) == def_us.end() ) {
-				def_us[ e->get_definition() ] = e;				
+				def_us[ e->get_definition() ] = e;
 			} else if ( e->used() ) {
-				def_us[ e->get_definition() ]->add_uses( e->get_uses() );
+				def_us[ e->get_definition() ]->add_uses( *e );
 			}
 		}
@@ -131,9 +208,12 @@
 			Statement *to = (*i).first;
 			Entry * entry = (*i).second;
-			std::list< BranchStmt *> &from = entry->get_uses();
+			std::list< Entry::UsageLoc > &from = entry->get_uses();
 
 			// no label definition found
 			if ( to == 0 ) {
-				Label undef = from.back()->get_target();
+				Label undef;
+				LabelGetter getLabel( undef );
+				from.back().accept( getLabel );
+				// Label undef = getLabel( from.back()->get_target() );
 				throw SemanticError ( "'" + undef + "' label not defined");
 			} // if
@@ -147,8 +227,12 @@
 
 			// redirect each of the source branch statements to the new target label
-			for ( std::list< BranchStmt *>::iterator j = from.begin(); j != from.end(); ++j ) {
-				BranchStmt *jump = *j;
-				assert( jump != 0 );
-				jump->set_target( finalLabel );
+			for ( std::list< Entry::UsageLoc >::iterator j = from.begin(); j != from.end(); ++j ) {
+				LabelSetter setLabel( finalLabel );
+				(*j).accept( setLabel );
+				// setLabel( *j, finalLabel );
+
+				// BranchStmt *jump = *j;
+				// assert( jump != 0 );
+				// jump->set_target( finalLabel );
 			} // for
 		} // for
Index: src/ControlStruct/LabelFixer.h
===================================================================
--- src/ControlStruct/LabelFixer.h	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
+++ src/ControlStruct/LabelFixer.h	(revision 1869adf4f0d1d49e336dd8261e524773d7d9c864)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri May 29 15:25:55 2015
-// Update Count     : 11
+// Last Modified On : Tue Jun 23 15:47:25 2015
+// Update Count     : 28
 //
 
@@ -53,12 +53,23 @@
 		virtual void visit( DeclStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
 		virtual void visit( BranchStmt *branchStmt );
+		virtual void visit( UntypedExpr *untyped );
 
 		Label setLabelsDef( std::list< Label > &, Statement *definition );
-		void setLabelsUsg( Label, BranchStmt *usage = 0 );
+		template< typename UsageNode >
+		void setLabelsUsg( Label, UsageNode *usage = 0 );
 
 	  private:
 		class Entry {
-		  public:
-			Entry( Statement *to = 0, BranchStmt *from = 0 );
+			public:
+			union UsageLoc {
+				Statement * stmt;
+				Expression * expr;
+
+				void accept( Visitor &visitor );
+			};
+
+			Entry( Statement *to ) : definition( to ) {}
+			Entry( Statement *to, Statement *from );
+			Entry( Statement *to, Expression *from );
 			bool used() { return ( usage.empty() ); }
 			bool defined() { return ( definition != 0 ); }
@@ -71,15 +82,26 @@
 			void set_definition( Statement *def ) { definition = def; }
 
-			std::list< BranchStmt *> &get_uses() { return usage; }
-			void add_use ( BranchStmt *use ) { usage.push_back( use ); }
-			void add_uses ( std::list<BranchStmt *> uses ) { usage.insert( usage.end(), uses.begin(), uses.end() ); }
+			std::list< UsageLoc > &get_uses() { return usage; }
+			void add_use( Statement *use ) {
+				UsageLoc loc;
+				loc.stmt = use;
+				usage.push_back( loc ); 
+			}
+			void add_use( Expression *use ) {
+				UsageLoc loc;
+				loc.expr = use;
+				usage.push_back( loc ); 				
+			}
+
+			void add_uses ( Entry &other ) { usage.insert( usage.end(), other.usage.begin(), usage.end() ); }
 		  private:
 			Label label;  
 			Statement *definition;
-			std::list<BranchStmt *> usage;
+			std::list<UsageLoc> usage;
 		};
 	          
 		std::map < Label, Entry *> labelTable;
 		LabelGenerator *generator;
+		Statement * currentStatement;
 	};
 } // namespace ControlStruct
Index: src/ControlStruct/LabelTypeChecker.cc
===================================================================
--- src/ControlStruct/LabelTypeChecker.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
+++ src/ControlStruct/LabelTypeChecker.cc	(revision 1869adf4f0d1d49e336dd8261e524773d7d9c864)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 15:32:15 2015
-// Update Count     : 2
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 24 16:24:48 2015
+// Update Count     : 3
 //
 
@@ -29,5 +29,5 @@
 		NameExpr *fname;
 		if ( ((fname = dynamic_cast<NameExpr *>(untypedExpr->get_function())) != 0) 
-			 && fname->get_name() == std::string("LabAddress") )
+			 && fname->get_name() == std::string("&&") )
 			std::cerr << "Taking the label of an address." << std::endl;
 		else {
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
+++ src/Parser/ExpressionNode.cc	(revision 1869adf4f0d1d49e336dd8261e524773d7d9c864)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jun 24 16:10:47 2015
-// Update Count     : 154
+// Last Modified On : Wed Jun 24 16:20:00 2015
+// Update Count     : 158
 // 
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
+++ src/ResolvExpr/Resolver.cc	(revision 1869adf4f0d1d49e336dd8261e524773d7d9c864)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 12:17:01 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jun 24 16:08:49 2015
-// Update Count     : 155
+// Last Modified On : Wed Jun 24 16:20:35 2015
+// Update Count     : 156
 //
 
@@ -363,4 +363,6 @@
 				resolveAggrInit( uit->get_baseUnion(), init, initEnd );
 			} else {
+				// member is not an aggregate type, so can't go any deeper
+
 				// might need to rethink what is being thrown
 				throw;
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
+++ src/SymTab/Validate.cc	(revision 1869adf4f0d1d49e336dd8261e524773d7d9c864)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:50:04 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 13 17:10:29 2015
-// Update Count     : 29
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 24 16:20:50 2015
+// Update Count     : 30
 //
 
@@ -176,4 +176,6 @@
 		acceptAll( translationUnit, pass1 );
 		acceptAll( translationUnit, pass2 );
+		// need to collect all of the assignment operators prior to
+		// this point and only generate assignment operators if one doesn't exist
 		AddStructAssignment::addStructAssignment( translationUnit );
 		acceptAll( translationUnit, pass3 );
