Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/AggregateDecl.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,14 +10,15 @@
 // Created On       : Sun May 17 23:56:39 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 13 18:03:30 2016
-// Update Count     : 10
+// Last Modified On : Mon Feb  6 15:31:23 2017
+// Update Count     : 17
 //
 
 #include "Declaration.h"
+#include "Attribute.h"
 #include "Type.h"
 #include "Common/utility.h"
 
 
-AggregateDecl::AggregateDecl( const std::string &name ) : Parent( name, DeclarationNode::NoStorageClass, LinkageSpec::Cforall ), body( false ) {
+AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes ) : Parent( name, DeclarationNode::NoStorageClass, LinkageSpec::Cforall ), body( false ), attributes( attributes ) {
 }
 
@@ -25,10 +26,12 @@
 	cloneAll( other.members, members );
 	cloneAll( other.parameters, parameters );
+	cloneAll( other.attributes, attributes );
 	body = other.body;
 }
 
 AggregateDecl::~AggregateDecl() {
+	deleteAll( attributes );
+	deleteAll( parameters );
 	deleteAll( members );
-	deleteAll( parameters );
 }
 
@@ -47,4 +50,8 @@
 		os << endl << string( indent+2, ' ' ) << "with members" << endl;
 		printAll( members, os, indent+4 );
+	} // if
+	if ( ! attributes.empty() ) {
+		os << endl << string( indent+2, ' ' ) << "with attributes" << endl;
+		printAll( attributes, os, indent+4 );
 	} // if
 }
Index: src/SynTree/ArrayType.cc
===================================================================
--- src/SynTree/ArrayType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/ArrayType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Thu May 12 14:07:16 2016
-// Update Count     : 11
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb  1 17:16:29 2017
+// Update Count     : 12
 //
 
@@ -19,6 +19,6 @@
 
 
-ArrayType::ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic )
-		: Type( tq ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
+ArrayType::ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes )
+	: Type( tq, attributes ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
 	base->set_isLvalue( false );
 }
Index: src/SynTree/AttrType.cc
===================================================================
--- src/SynTree/AttrType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/AttrType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 16:41:51 2015
-// Update Count     : 2
+// Last Modified On : Wed Feb  1 17:17:59 2017
+// Update Count     : 3
 //
 
@@ -19,10 +19,10 @@
 
 
-AttrType::AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr )
-	: Type( tq ), name( name ), expr( expr ), type( 0 ), isType( false ) {
+AttrType::AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr, const std::list< Attribute * > & attributes )
+	: Type( tq, attributes ), name( name ), expr( expr ), type( 0 ), isType( false ) {
 }
 
-AttrType::AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type )
-	: Type( tq ), name( name ), expr( 0 ), type( type ), isType( true ) {
+AttrType::AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type, const std::list< Attribute * > & attributes )
+	: Type( tq, attributes ), name( name ), expr( 0 ), type( type ), isType( true ) {
 }
 
Index: src/SynTree/BasicType.cc
===================================================================
--- src/SynTree/BasicType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/BasicType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Aug 12 14:15:45 2015
-// Update Count     : 6
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb  1 17:12:15 2017
+// Update Count     : 8
 //
 
@@ -17,5 +17,5 @@
 #include "Type.h"
 
-BasicType::BasicType( const Type::Qualifiers &tq, Kind bt ) : Type( tq ), kind( bt ) {}
+BasicType::BasicType( const Type::Qualifiers &tq, Kind bt, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), kind( bt ) {}
 
 void BasicType::print( std::ostream &os, int indent ) const {
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/Declaration.h	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 13 13:37:33 2016
-// Update Count     : 49
+// Last Modified On : Fri Jan 20 15:07:29 2017
+// Update Count     : 53
 //
 
@@ -225,5 +225,5 @@
 	typedef Declaration Parent;
   public:
-	AggregateDecl( const std::string &name );
+	AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() );
 	AggregateDecl( const AggregateDecl &other );
 	virtual ~AggregateDecl();
@@ -231,4 +231,7 @@
 	std::list<Declaration*>& get_members() { return members; }
 	std::list<TypeDecl*>& get_parameters() { return parameters; }
+
+	std::list< Attribute * >& get_attributes() { return attributes; }
+	const std::list< Attribute * >& get_attributes() const { return attributes; }
 
 	bool has_body() const { return body; }
@@ -244,4 +247,5 @@
 	std::list<TypeDecl*> parameters;
 	bool body;
+	std::list< Attribute * > attributes;
 };
 
@@ -249,5 +253,5 @@
 	typedef AggregateDecl Parent;
   public:
-	StructDecl( const std::string &name ) : Parent( name ) {}
+	StructDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
 	StructDecl( const StructDecl &other ) : Parent( other ) {}
 
@@ -262,5 +266,5 @@
 	typedef AggregateDecl Parent;
   public:
-	UnionDecl( const std::string &name ) : Parent( name ) {}
+	UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
 	UnionDecl( const UnionDecl &other ) : Parent( other ) {}
 
@@ -275,5 +279,5 @@
 	typedef AggregateDecl Parent;
   public:
-	EnumDecl( const std::string &name ) : Parent( name ) {}
+	EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
 	EnumDecl( const EnumDecl &other ) : Parent( other ) {}
 
@@ -288,5 +292,7 @@
 	typedef AggregateDecl Parent;
   public:
-	TraitDecl( const std::string &name ) : Parent( name ) {}
+	TraitDecl( const std::string &name, const std::list< Attribute * > & attributes ) : Parent( name ) {
+		assertf( attributes.empty(), "attribute unsupported for traits" );
+	}
 	TraitDecl( const TraitDecl &other ) : Parent( other ) {}
 
Index: src/SynTree/FunctionType.cc
===================================================================
--- src/SynTree/FunctionType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/FunctionType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 09:01:28 2015
-// Update Count     : 1
+// Last Modified On : Wed Feb  1 17:21:00 2017
+// Update Count     : 2
 //
 
@@ -21,5 +21,5 @@
 #include "Tuples/Tuples.h"
 
-FunctionType::FunctionType( const Type::Qualifiers &tq, bool isVarArgs ) : Type( tq ), isVarArgs( isVarArgs ) {
+FunctionType::FunctionType( const Type::Qualifiers &tq, bool isVarArgs, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), isVarArgs( isVarArgs ) {
 }
 
Index: src/SynTree/PointerType.cc
===================================================================
--- src/SynTree/PointerType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/PointerType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 15 15:39:10 2015
-// Update Count     : 5
+// Last Modified On : Wed Feb  1 17:17:13 2017
+// Update Count     : 6
 //
 
@@ -18,10 +18,10 @@
 #include "Common/utility.h"
 
-PointerType::PointerType( const Type::Qualifiers &tq, Type *base )
-	: Type( tq ), base( base ), dimension( 0 ), isVarLen( false ), isStatic( false ) {
+PointerType::PointerType( const Type::Qualifiers &tq, Type *base, const std::list< Attribute * > & attributes )
+	: Type( tq, attributes ), base( base ), dimension( 0 ), isVarLen( false ), isStatic( false ) {
 }
 
-PointerType::PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic )
-	: Type( tq ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
+PointerType::PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes )
+	: Type( tq, attributes ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
 }
 
Index: src/SynTree/ReferenceToType.cc
===================================================================
--- src/SynTree/ReferenceToType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/ReferenceToType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 13 18:03:30 2016
-// Update Count     : 9
+// Last Modified On : Thu Feb  2 17:45:07 2017
+// Update Count     : 23
 //
 
@@ -23,5 +23,5 @@
 #include "Common/utility.h"
 
-ReferenceToType::ReferenceToType( const Type::Qualifiers &tq, const std::string &name ) : Type( tq ), name( name ) {
+ReferenceToType::ReferenceToType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), name( name ) {
 }
 
@@ -55,5 +55,6 @@
 } // namespace
 
-StructInstType::StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct ) : Parent( tq, baseStruct->get_name() ), baseStruct( baseStruct ) {}
+StructInstType::StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes ) :
+		Parent( tq, baseStruct->get_name(), attributes ), baseStruct( baseStruct ) {}
 
 std::string StructInstType::typeString() const { return "struct"; }
@@ -64,5 +65,5 @@
 }
 
-bool StructInstType::isComplete() const { return baseStruct->has_body(); }
+bool StructInstType::isComplete() const { return baseStruct ? baseStruct->has_body() : false; }
 
 void StructInstType::lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const {
@@ -85,12 +86,16 @@
 }
 
+
+UnionInstType::UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes ) :
+		Parent( tq, baseUnion->get_name(), attributes ), baseUnion( baseUnion ) {}
+
 std::string UnionInstType::typeString() const { return "union"; }
 
-std::list<TypeDecl*>* UnionInstType::get_baseParameters() {
+std::list< TypeDecl * > * UnionInstType::get_baseParameters() {
 	if ( ! baseUnion ) return NULL;
 	return &baseUnion->get_parameters();
 }
 
-bool UnionInstType::isComplete() const { return baseUnion->has_body(); }
+bool UnionInstType::isComplete() const { return baseUnion ? baseUnion->has_body() : false; }
 
 void UnionInstType::lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const {
@@ -113,5 +118,11 @@
 }
 
+
+EnumInstType::EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes ) :
+		Parent( tq, baseEnum->get_name(), attributes ), baseEnum( baseEnum ) {}
+
 std::string EnumInstType::typeString() const { return "enum"; }
+
+bool EnumInstType::isComplete() const { return baseEnum ? baseEnum->has_body() : false; }
 
 std::string TraitInstType::typeString() const { return "trait"; }
@@ -127,9 +138,9 @@
 bool TraitInstType::isComplete() const { assert( false ); }
 
-TypeInstType::TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType ) : Parent( tq, name ) {
+TypeInstType::TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType, const std::list< Attribute * > & attributes ) : Parent( tq, name, attributes ) {
 	set_baseType( baseType );
 }
 
-TypeInstType::TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype ) : Parent( tq, name ), baseType( 0 ), isFtype( isFtype ) {
+TypeInstType::TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype, const std::list< Attribute * > & attributes ) : Parent( tq, name, attributes ), baseType( 0 ), isFtype( isFtype ) {
 }
 
Index: src/SynTree/TupleType.cc
===================================================================
--- src/SynTree/TupleType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/TupleType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 11:00:01 2015
-// Update Count     : 2
+// Last Modified On : Wed Feb  1 17:10:58 2017
+// Update Count     : 3
 //
 
@@ -17,5 +17,5 @@
 #include "Common/utility.h"
 
-TupleType::TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types ) : Type( tq ), types( types ) {
+TupleType::TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), types( types ) {
 }
 
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/Type.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Dec 09 14:08:48 2015
-// Update Count     : 4
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Feb  2 11:26:24 2017
+// Update Count     : 12
 //
 
@@ -18,5 +18,8 @@
 #include "Type.h"
 #include "Declaration.h"
+#include "Attribute.h"
 #include "Common/utility.h"
+
+using namespace std;
 
 const char *BasicType::typeNames[BasicType::NUMBER_OF_BASIC_TYPES] = {
@@ -44,12 +47,14 @@
 };
 
-Type::Type( const Qualifiers &tq ) : tq( tq ) {}
+Type::Type( const Qualifiers &tq, const std::list< Attribute * > & attributes ) : tq( tq ), attributes( attributes ) {}
 
 Type::Type( const Type &other ) : tq( other.tq ) {
 	cloneAll( other.forall, forall );
+	cloneAll( other.attributes, attributes );
 }
 
 Type::~Type() {
 	deleteAll( forall );
+	deleteAll( attributes );
 }
 
@@ -70,7 +75,4 @@
 		os << "_Atomic ";
 	} // if
-	if ( isAttribute ) {
-		os << "__attribute(( )) ";
-	} // if
 }
 
@@ -81,4 +83,10 @@
 		os << std::string( indent+2, ' ' );
 	} // if
+
+	if ( ! attributes.empty() ) {
+		os << endl << string( indent+2, ' ' ) << "with attributes" << endl;
+		printAll( attributes, os, indent+4 );
+	} // if
+	
 	tq.print( os, indent );
 }
@@ -89,5 +97,5 @@
 	} else {
 		out << "nullptr";
-	}
+	} // if
 	return out;
 }
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/Type.h	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 13 11:46:54 2016
-// Update Count     : 23
+// Last Modified On : Thu Feb  2 17:43:01 2017
+// Update Count     : 33
 //
 
@@ -25,6 +25,6 @@
   public:
 	struct Qualifiers {
-		Qualifiers(): isConst( false ), isVolatile( false ), isRestrict( false ), isLvalue( false ), isAtomic( false ), isAttribute( false ) {}
-		Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic, bool isAttribute ): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ), isAttribute( isAttribute ) {}
+		Qualifiers(): isConst( false ), isVolatile( false ), isRestrict( false ), isLvalue( false ), isAtomic( false ) {}
+		Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic ): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ) {}
 
 		Qualifiers &operator&=( const Qualifiers &other );
@@ -45,8 +45,7 @@
 		bool isLvalue;
 		bool isAtomic;
-		bool isAttribute;
 	};
 
-	Type( const Qualifiers &tq );
+	Type( const Qualifiers &tq, const std::list< Attribute * > & attributes );
 	Type( const Type &other );
 	virtual ~Type();
@@ -58,5 +57,4 @@
 	bool get_isLvalue() { return tq.isLvalue; }
 	bool get_isAtomic() { return tq.isAtomic; }
-	bool get_isAttribute() { return tq.isAttribute; }
 	void set_isConst( bool newValue ) { tq.isConst = newValue; }
 	void set_isVolatile( bool newValue ) { tq.isVolatile = newValue; }
@@ -64,8 +62,10 @@
 	void set_isLvalue( bool newValue ) { tq.isLvalue = newValue; }
 	void set_isAtomic( bool newValue ) { tq.isAtomic = newValue; }
-	void set_isAttribute( bool newValue ) { tq.isAttribute = newValue; }
 
 	typedef std::list<TypeDecl *> ForallList;
 	ForallList& get_forall() { return forall; }
+
+	std::list< Attribute * >& get_attributes() { return attributes; }
+	const std::list< Attribute * >& get_attributes() const { return attributes; }
 
 	/// How many elemental types are represented by this type
@@ -83,4 +83,5 @@
 	Qualifiers tq;
 	ForallList forall;
+	std::list< Attribute * > attributes;
 };
 
@@ -89,5 +90,5 @@
 class VoidType : public Type {
   public:
-	VoidType( const Type::Qualifiers &tq );
+	VoidType( const Type::Qualifiers &tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
 
 	virtual unsigned size() const { return 0; };
@@ -129,5 +130,5 @@
 	static const char *typeNames[];						// string names for basic types, MUST MATCH with Kind
 
-	BasicType( const Type::Qualifiers &tq, Kind bt );
+	BasicType( const Type::Qualifiers &tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
 
 	Kind get_kind() { return kind; }
@@ -146,6 +147,6 @@
 class PointerType : public Type {
   public:
-	PointerType( const Type::Qualifiers &tq, Type *base );
-	PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic );
+	PointerType( const Type::Qualifiers &tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
+	PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
 	PointerType( const PointerType& );
 	virtual ~PointerType();
@@ -175,5 +176,5 @@
 class ArrayType : public Type {
   public:
-	ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic );
+	ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
 	ArrayType( const ArrayType& );
 	virtual ~ArrayType();
@@ -203,5 +204,5 @@
 class FunctionType : public Type {
   public:
-	FunctionType( const Type::Qualifiers &tq, bool isVarArgs );
+	FunctionType( const Type::Qualifiers &tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
 	FunctionType( const FunctionType& );
 	virtual ~FunctionType();
@@ -231,5 +232,5 @@
 class ReferenceToType : public Type {
   public:
-	ReferenceToType( const Type::Qualifiers &tq, const std::string &name );
+	ReferenceToType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes );
 	ReferenceToType( const ReferenceToType &other );
 	virtual ~ReferenceToType();
@@ -253,6 +254,6 @@
 	typedef ReferenceToType Parent;
   public:
-	StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {}
-	StructInstType( const Type::Qualifiers &tq, StructDecl * baseStruct );
+	StructInstType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseStruct( 0 ) {}
+	StructInstType( const Type::Qualifiers &tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 	StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {}
 
@@ -285,12 +286,13 @@
 	typedef ReferenceToType Parent;
   public:
-	UnionInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseUnion( 0 ) {}
+	UnionInstType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseUnion( 0 ) {}
+	UnionInstType( const Type::Qualifiers &tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 	UnionInstType( const UnionInstType &other ) : Parent( other ), baseUnion( other.baseUnion ) {}
 
 	UnionDecl *get_baseUnion() const { return baseUnion; }
-	void set_baseUnion( UnionDecl *newValue ) { baseUnion = newValue; }
+	void set_baseUnion( UnionDecl * newValue ) { baseUnion = newValue; }
 
 	/// Accesses generic parameters of base union (NULL if none such)
-	std::list<TypeDecl*> * get_baseParameters();
+	std::list< TypeDecl * > * get_baseParameters();
 
 	virtual bool isComplete() const;
@@ -316,9 +318,12 @@
 	typedef ReferenceToType Parent;
   public:
-	EnumInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
-	EnumInstType( const EnumInstType &other ) : Parent( other ) {}
-
-	// xxx - enum inst does not currently contain a pointer to base, this should be fixed.
-	// virtual bool isComplete() const { return baseEnum()->hasBody(); }
+	EnumInstType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
+	EnumInstType( const Type::Qualifiers &tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
+	EnumInstType( const EnumInstType &other ) : Parent( other ), baseEnum( other.baseEnum ) {}
+
+	EnumDecl *get_baseEnum() const { return baseEnum; }
+	void set_baseEnum( EnumDecl *newValue ) { baseEnum = newValue; }
+
+	virtual bool isComplete() const;
 
 	virtual EnumInstType *clone() const { return new EnumInstType( *this ); }
@@ -327,4 +332,8 @@
   private:
 	virtual std::string typeString() const;
+
+	// this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
+	// where the union used in this type is actually defined
+	EnumDecl *baseEnum = nullptr;
 };
 
@@ -332,5 +341,5 @@
 	typedef ReferenceToType Parent;
   public:
-	TraitInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
+	TraitInstType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
 	TraitInstType( const TraitInstType &other );
 	~TraitInstType();
@@ -354,6 +363,6 @@
 	typedef ReferenceToType Parent;
   public:
-	TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType );
-	TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype );
+	TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
+	TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 	TypeInstType( const TypeInstType &other );
 	~TypeInstType();
@@ -380,5 +389,5 @@
 class TupleType : public Type {
   public:
-	TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types = std::list< Type * >() );
+	TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types = std::list< Type * >(), const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 	TupleType( const TupleType& );
 	virtual ~TupleType();
@@ -410,5 +419,5 @@
 class TypeofType : public Type {
   public:
-	TypeofType( const Type::Qualifiers &tq, Expression *expr );
+	TypeofType( const Type::Qualifiers &tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 	TypeofType( const TypeofType& );
 	virtual ~TypeofType();
@@ -429,6 +438,6 @@
 class AttrType : public Type {
   public:
-	AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr );
-	AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type );
+	AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
+	AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 	AttrType( const AttrType& );
 	virtual ~AttrType();
@@ -460,5 +469,5 @@
   public:
 	VarArgsType();
-	VarArgsType( Type::Qualifiers tq );
+	VarArgsType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 
 	virtual bool isComplete() const{ return true; } // xxx - is this right?
@@ -474,5 +483,5 @@
   public:
 	ZeroType();
-	ZeroType( Type::Qualifiers tq );
+	ZeroType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 
 	virtual ZeroType *clone() const { return new ZeroType( *this ); }
@@ -486,5 +495,5 @@
   public:
 	OneType();
-	OneType( Type::Qualifiers tq );
+	OneType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
 
 	virtual OneType *clone() const { return new OneType( *this ); }
Index: src/SynTree/TypeofType.cc
===================================================================
--- src/SynTree/TypeofType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/TypeofType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 11:13:29 2015
-// Update Count     : 2
+// Last Modified On : Wed Feb  1 17:18:29 2017
+// Update Count     : 3
 //
 
@@ -18,5 +18,5 @@
 #include "Common/utility.h"
 
-TypeofType::TypeofType( const Type::Qualifiers &tq, Expression *expr ) : Type( tq ), expr( expr ) {
+TypeofType::TypeofType( const Type::Qualifiers &tq, Expression *expr, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), expr( expr ) {
 }
 
Index: src/SynTree/VarArgsType.cc
===================================================================
--- src/SynTree/VarArgsType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/VarArgsType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,13 +10,13 @@
 // Created On       : Thu Feb 25 16:34:00 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:10:40 2016
-// Update Count     : 2
+// Last Modified On : Wed Feb  1 17:14:48 2017
+// Update Count     : 4
 //
 
 #include "Type.h"
 
-VarArgsType::VarArgsType() : Type( Type::Qualifiers() ) {}
+VarArgsType::VarArgsType() : Type( Type::Qualifiers(), std::list< Attribute * >() ) {}
 
-VarArgsType::VarArgsType( Type::Qualifiers tq ) : Type( tq ) {}
+VarArgsType::VarArgsType( Type::Qualifiers tq, const std::list< Attribute * > & attributes ) : Type( tq, attributes ) {}
 
 void VarArgsType::print( std::ostream &os, int indent ) const {
Index: src/SynTree/VoidType.cc
===================================================================
--- src/SynTree/VoidType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/VoidType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -10,11 +10,11 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 11:16:42 2015
-// Update Count     : 1
+// Last Modified On : Wed Feb  1 17:09:26 2017
+// Update Count     : 3
 //
 
 #include "Type.h"
 
-VoidType::VoidType( const Type::Qualifiers &tq ) : Type( tq ) {
+VoidType::VoidType( const Type::Qualifiers &tq, const std::list< Attribute * > & attributes ) : Type( tq, attributes ) {
 }
 
Index: src/SynTree/ZeroOneType.cc
===================================================================
--- src/SynTree/ZeroOneType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
+++ src/SynTree/ZeroOneType.cc	(revision 8d4f7fe847eef8e0d54d3b2fd88d35f0d28ef095)
@@ -9,14 +9,14 @@
 // Author           : Aaron B. Moss
 // Created On       : Fri Sep 16 14:08:00 2016
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Fri Sep 16 14:08:00 2016
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb  1 17:15:46 2017
+// Update Count     : 4
 //
 
 #include "Type.h"
 
-ZeroType::ZeroType() : Type( Type::Qualifiers() ) {}
+ZeroType::ZeroType() : Type( Type::Qualifiers(), std::list< Attribute * >() ) {}
 
-ZeroType::ZeroType( Type::Qualifiers tq ) : Type( tq ) {}
+ZeroType::ZeroType( Type::Qualifiers tq, const std::list< Attribute * > & attributes ) : Type( tq, attributes ) {}
 
 void ZeroType::print( std::ostream &os, int indent ) const {
@@ -24,7 +24,7 @@
 }
 
-OneType::OneType() : Type( Type::Qualifiers() ) {}
+OneType::OneType() : Type( Type::Qualifiers(), std::list< Attribute * >() ) {}
 
-OneType::OneType( Type::Qualifiers tq ) : Type( tq ) {}
+OneType::OneType( Type::Qualifiers tq, const std::list< Attribute * > & attributes ) : Type( tq, attributes ) {}
 
 void OneType::print( std::ostream &os, int indent ) const {
