Index: src/SynTree/AddressExpr.cc
===================================================================
--- src/SynTree/AddressExpr.cc	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/AddressExpr.cc	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -70,4 +70,15 @@
 }
 
+LabelAddressExpr::LabelAddressExpr( const Label &arg ) : arg( arg ) {
+	// label address always has type void *
+	result = new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) );
+}
+LabelAddressExpr::LabelAddressExpr( const LabelAddressExpr & other ) : Expression( other ), arg( other.arg ) {}
+LabelAddressExpr::~LabelAddressExpr() {}
+
+void LabelAddressExpr::print( std::ostream & os, int indent ) const {
+	os << "Address of label:" << std::endl << std::string( indent+2, ' ' ) << arg;
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Declaration.h	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Aug 14 10:15:00 2017
-// Update Count     : 128
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Sep  3 19:24:06 2017
+// Update Count     : 131
 //
 
@@ -82,5 +82,5 @@
 	int scopeLevel = 0;
 
-	ConstantExpr *asmName;
+	Expression *asmName;
 	std::list< Attribute * > attributes;
 
@@ -97,6 +97,6 @@
 	DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }
 
-	ConstantExpr *get_asmName() const { return asmName; }
-	DeclarationWithType * set_asmName( ConstantExpr *newValue ) { asmName = newValue; return this; }
+	Expression *get_asmName() const { return asmName; }
+	DeclarationWithType * set_asmName( Expression *newValue ) { asmName = newValue; return this; }
 
 	std::list< Attribute * >& get_attributes() { return attributes; }
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Expression.h	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -9,8 +9,9 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug  8 11:54:00 2017
-// Update Count     : 44
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Sep  3 19:23:46 2017
+// Update Count     : 48
 //
+
 #pragma once
 
@@ -24,4 +25,5 @@
 #include "Constant.h"             // for Constant
 #include "Initializer.h"          // for Designation (ptr only), Initializer
+#include "Label.h"                // for Label
 #include "Mutator.h"              // for Mutator
 #include "SynTree.h"              // for UniqueId
@@ -171,15 +173,13 @@
 };
 
-// xxx - this doesn't appear to actually be hooked in anywhere. We should use this instead of the "&&"" UntypedExpr hack
+// GCC &&label
+// https://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Labels-as-Values.html
 class LabelAddressExpr : public Expression {
   public:
-	Expression * arg;
-
-	LabelAddressExpr( Expression * arg );
+	Label arg;
+
+	LabelAddressExpr( const Label &arg );
 	LabelAddressExpr( const LabelAddressExpr & other );
 	virtual ~LabelAddressExpr();
-
-	Expression * get_arg() const { return arg; }
-	void set_arg(Expression * newValue ) { arg = newValue; }
 
 	virtual LabelAddressExpr * clone() const { return new LabelAddressExpr( * this ); }
@@ -538,8 +538,8 @@
   public:
 	Expression * inout;
-	ConstantExpr * constraint;
+	Expression * constraint;
 	Expression * operand;
 
-	AsmExpr( Expression * inout, ConstantExpr * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
+	AsmExpr( Expression * inout, Expression * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
 	AsmExpr( const AsmExpr & other );
 	virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
@@ -548,6 +548,6 @@
 	void set_inout( Expression * newValue ) { inout = newValue; }
 
-	ConstantExpr * get_constraint() const { return constraint; }
-	void set_constraint( ConstantExpr * newValue ) { constraint = newValue; }
+	Expression * get_constraint() const { return constraint; }
+	void set_constraint( Expression * newValue ) { constraint = newValue; }
 
 	Expression * get_operand() const { return operand; }
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Mutator.cc	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -246,5 +246,4 @@
 	labelAddressExpr->set_env( maybeMutate( labelAddressExpr->get_env(), *this ) );
 	labelAddressExpr->set_result( maybeMutate( labelAddressExpr->get_result(), *this ) );
-	labelAddressExpr->set_arg( maybeMutate( labelAddressExpr->get_arg(), *this ) );
 	return labelAddressExpr;
 }
@@ -538,5 +537,4 @@
 Type * Mutator::mutate( TraitInstType *aggregateUseType ) {
 	handleReferenceToType( aggregateUseType );
-	mutateAll( aggregateUseType->get_members(), *this );
 	return aggregateUseType;
 }
Index: src/SynTree/ReferenceToType.cc
===================================================================
--- src/SynTree/ReferenceToType.cc	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/ReferenceToType.cc	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -132,10 +132,10 @@
 std::string TraitInstType::typeString() const { return "trait"; }
 
-TraitInstType::TraitInstType( const TraitInstType &other ) : Parent( other ) {
-	cloneAll( other.members, members );
+TraitInstType::TraitInstType( const Type::Qualifiers & tq, TraitDecl * baseTrait, const std::list< Attribute * > & attributes ) : Parent( tq, baseTrait->name, attributes ), baseTrait( baseTrait ) {}
+
+TraitInstType::TraitInstType( const TraitInstType &other ) : Parent( other ), baseTrait( other.baseTrait ) {
 }
 
 TraitInstType::~TraitInstType() {
-	deleteAll( members );
 }
 
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Statement.cc	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 17 16:17:20 2017
-// Update Count     : 67
+// Last Modified On : Sun Sep  3 20:46:44 2017
+// Update Count     : 68
 //
 
@@ -52,5 +52,5 @@
 
 
-AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
+AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
 
 AsmStmt::AsmStmt( const AsmStmt & other ) : Statement( other ), voltile( other.voltile ), instruction( maybeClone( other.instruction ) ), gotolabels( other.gotolabels ) {
@@ -89,18 +89,23 @@
 
 BranchStmt::BranchStmt( std::list<Label> labels, Label target, Type type ) throw ( SemanticError ) :
-	Statement( labels ), originalTarget( target ), target( target ), computedTarget( NULL ), type( type ) {
+	Statement( labels ), originalTarget( target ), target( target ), computedTarget( nullptr ), type( type ) {
 	//actually this is a syntactic error signaled by the parser
-	if ( type == BranchStmt::Goto && target.empty() )
+	if ( type == BranchStmt::Goto && target.empty() ) {
 		throw SemanticError("goto without target");
+	}
 }
 
 BranchStmt::BranchStmt( std::list<Label> labels, Expression *computedTarget, Type type ) throw ( SemanticError ) :
 	Statement( labels ), computedTarget( computedTarget ), type( type ) {
-	if ( type != BranchStmt::Goto || computedTarget == 0 )
+	if ( type != BranchStmt::Goto || computedTarget == nullptr ) {
 		throw SemanticError("Computed target not valid in branch statement");
+	}
 }
 
 void BranchStmt::print( std::ostream &os, int indent ) const {
 	os << string( indent, ' ' ) << "Branch (" << brType[type] << ")" << endl ;
+	if ( target != "" ) os << string( indent+2, ' ' ) << "with target: " << target << endl;
+	if ( originalTarget != "" ) os << string( indent+2, ' ' ) << "with original target: " << originalTarget << endl;
+	if ( computedTarget != nullptr ) os << string( indent+2, ' ' ) << "with computed target: " << computedTarget << endl;
 }
 
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Statement.h	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 17 15:37:53 2017
-// Update Count     : 72
+// Last Modified On : Sun Sep  3 20:46:46 2017
+// Update Count     : 77
 //
 
@@ -98,10 +98,10 @@
   public:
 	bool voltile;
-	ConstantExpr *instruction;
+	Expression *instruction;
 	std::list<Expression *> output, input;
 	std::list<ConstantExpr *> clobber;
 	std::list<Label> gotolabels;
 
-	AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> input, std::list<Expression *> output, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );
+	AsmStmt( std::list<Label> labels, bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );
 	AsmStmt( const AsmStmt &other );
 	virtual ~AsmStmt();
@@ -109,19 +109,19 @@
 	bool get_voltile() { return voltile; }
 	void set_voltile( bool newValue ) { voltile = newValue; }
-	ConstantExpr *get_instruction() { return instruction; }
-	void set_instruction( ConstantExpr *newValue ) { instruction = newValue; }
-	std::list<Expression *> &get_output() { return output; }
-	void set_output( const std::list<Expression *> &newValue ) { output = newValue; }
-	std::list<Expression *> &get_input() { return input; }
+	Expression * get_instruction() { return instruction; }
+	void set_instruction( Expression * newValue ) { instruction = newValue; }
+	std::list<Expression *> & get_output() { return output; }
+	void set_output( const std::list<Expression *> & newValue ) { output = newValue; }
+	std::list<Expression *> & get_input() { return input; }
 	void set_input( const std::list<Expression *> &newValue ) { input = newValue; }
-	std::list<ConstantExpr *> &get_clobber() { return clobber; }
+	std::list<ConstantExpr *> & get_clobber() { return clobber; }
 	void set_clobber( const std::list<ConstantExpr *> &newValue ) { clobber = newValue; }
-	std::list<Label> &get_gotolabels() { return gotolabels; }
+	std::list<Label> & get_gotolabels() { return gotolabels; }
 	void set_gotolabels( const std::list<Label> &newValue ) { gotolabels = newValue; }
 
-	virtual AsmStmt *clone() const { return new AsmStmt( *this ); }
-	virtual void accept( Visitor &v ) { v.visit( this ); }
-	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
-	virtual void print( std::ostream &os, int indent = 0 ) const;
+	virtual AsmStmt * clone() const { return new AsmStmt( *this ); }
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Statement * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os, int indent = 0 ) const;
 };
 
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Type.h	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -471,13 +471,12 @@
 	typedef ReferenceToType Parent;
   public:
-	// this member is filled in by the validate pass, which instantiates the members of the correponding
-	// aggregate with the actual type parameters specified for this use of the context
-	std::list< Declaration* > members;
-
-	TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
+	// this decl is not "owned" by the trait inst; it is merely a pointer to elsewhere in the tree,
+	// where the trait used in this type is actually defined
+	TraitDecl * baseTrait = nullptr;
+
+	TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}
+	TraitInstType( const Type::Qualifiers & tq, TraitDecl * baseTrait, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
 	TraitInstType( const TraitInstType & other );
 	~TraitInstType();
-
-	std::list< Declaration* >& get_members() { return members; }
 
 	virtual bool isComplete() const;
Index: src/SynTree/TypeSubstitution.h
===================================================================
--- src/SynTree/TypeSubstitution.h	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/TypeSubstitution.h	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -177,5 +177,5 @@
 void applySubstitution( FormalIterator formalBegin, FormalIterator formalEnd, ActualIterator actual, MemberIterator memberBegin, MemberIterator memberEnd, OutputIterator out ) {
 	TypeSubstitution sub = TypeSubstitution( formalBegin, formalEnd, actual );
-	for ( std::list< Declaration* >::iterator i = memberBegin; i != memberEnd; ++i ) {
+	for ( auto i = memberBegin; i != memberEnd; ++i ) {
 		sub.apply( *i );
 		*out++ = *i;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 871cdb4cbb92efed083345284bc13f2c3e0da057)
+++ src/SynTree/Visitor.cc	(revision b3f252a219989f7ab8f2f00efbcad32b69910b55)
@@ -205,5 +205,4 @@
 void Visitor::visit( LabelAddressExpr *labAddressExpr ) {
 	maybeAccept( labAddressExpr->get_result(), *this );
-	maybeAccept( labAddressExpr->get_arg(), *this );
 }
 
@@ -429,5 +428,4 @@
 void Visitor::visit( TraitInstType *aggregateUseType ) {
 	handleReferenceToType( static_cast< ReferenceToType * >( aggregateUseType ) );
-	acceptAll( aggregateUseType->get_members(), *this );
 }
 
