Index: src/SynTree/Attribute.h
===================================================================
--- src/SynTree/Attribute.h	(revision d67cdb749954789d84d7a8bbabc0ec601347a7bb)
+++ src/SynTree/Attribute.h	(revision 7fc7cdbdb518babea2482db157b3a9e2122cddbf)
@@ -20,10 +20,18 @@
 #include <string>  // for string, operator==
 
+#include "BaseSyntaxNode.h"
+#include "Mutator.h"
+#include "Visitor.h"
+
 class Expression;
 
 // GCC attribute
 // https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Attribute-Syntax.html#Attribute-Syntax
-class Attribute {
+class Attribute : public BaseSyntaxNode {
   public:
+	std::string name;
+	// to keep things nice and tight, use NameExpr for special identifier parameters
+	std::list< Expression * > parameters;
+
 	Attribute( std::string name = "", const std::list< Expression * > & parameters = std::list< Expression * >() ) : name( name ), parameters( parameters ) {}
 	Attribute( const Attribute &other );
@@ -36,9 +44,7 @@
 
 	Attribute * clone() const { return new Attribute( *this ); }
-	void print( std:: ostream &os, int indent = 0 ) const;
-  private:
-	std::string name;
-	// to keep things nice and tight, use NameExpr for special identifier parameters
-	std::list< Expression * > parameters;
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Attribute * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os, int indent = 0 ) const;
 };
 
Index: src/SynTree/BaseSyntaxNode.h
===================================================================
--- src/SynTree/BaseSyntaxNode.h	(revision d67cdb749954789d84d7a8bbabc0ec601347a7bb)
+++ src/SynTree/BaseSyntaxNode.h	(revision 7fc7cdbdb518babea2482db157b3a9e2122cddbf)
@@ -18,4 +18,5 @@
 #include "Common/CodeLocation.h"
 class Visitor;
+class Mutator;
 
 class BaseSyntaxNode {
@@ -25,6 +26,8 @@
 	virtual ~BaseSyntaxNode() {}
 
+	virtual BaseSyntaxNode * clone() const = 0;
 	virtual void accept( Visitor & v ) = 0;
-  	virtual void print( std::ostream & os, int indent = 0 ) const = 0;
+	virtual BaseSyntaxNode * acceptMutator( Mutator & m ) = 0;
+	virtual void print( std::ostream & os, int indent = 0 ) const = 0;
 };
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision d67cdb749954789d84d7a8bbabc0ec601347a7bb)
+++ src/SynTree/Mutator.cc	(revision 7fc7cdbdb518babea2482db157b3a9e2122cddbf)
@@ -17,4 +17,5 @@
 #include <list>                // for list
 
+#include "Attribute.h"         // for Attribute
 #include "Declaration.h"       // for ObjectDecl, Declaration, DeclarationWi...
 #include "Expression.h"        // for Expression, ConstantExpr, ConditionalExpr
@@ -36,4 +37,5 @@
 	objectDecl->set_init( maybeMutate( objectDecl->get_init(), *this ) );
 	objectDecl->set_bitfieldWidth( maybeMutate( objectDecl->get_bitfieldWidth(), *this ) );
+	mutateAll( objectDecl->attributes, *this );
 	return objectDecl;
 }
@@ -42,4 +44,5 @@
 	functionDecl->set_functionType( maybeMutate( functionDecl->get_functionType(), *this ) );
 	functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
+	mutateAll( functionDecl->attributes, *this );
 	return functionDecl;
 }
@@ -618,4 +621,9 @@
 }
 
+Attribute * Mutator::mutate( Attribute * attribute ) {
+	mutateAll( attribute->parameters, *this );
+	return attribute;
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision d67cdb749954789d84d7a8bbabc0ec601347a7bb)
+++ src/SynTree/Mutator.h	(revision 7fc7cdbdb518babea2482db157b3a9e2122cddbf)
@@ -25,98 +25,100 @@
 	virtual ~Mutator();
   public:
-	virtual DeclarationWithType* mutate( ObjectDecl *objectDecl );
-	virtual DeclarationWithType* mutate( FunctionDecl *functionDecl );
-	virtual Declaration* mutate( StructDecl *aggregateDecl );
-	virtual Declaration* mutate( UnionDecl *aggregateDecl );
-	virtual Declaration* mutate( EnumDecl *aggregateDecl );
-	virtual Declaration* mutate( TraitDecl *aggregateDecl );
-	virtual Declaration* mutate( TypeDecl *typeDecl );
-	virtual Declaration* mutate( TypedefDecl *typeDecl );
-	virtual AsmDecl* mutate( AsmDecl *asmDecl );
+	virtual DeclarationWithType * mutate( ObjectDecl * objectDecl );
+	virtual DeclarationWithType * mutate( FunctionDecl * functionDecl );
+	virtual Declaration * mutate( StructDecl * aggregateDecl );
+	virtual Declaration * mutate( UnionDecl * aggregateDecl );
+	virtual Declaration * mutate( EnumDecl * aggregateDecl );
+	virtual Declaration * mutate( TraitDecl * aggregateDecl );
+	virtual Declaration * mutate( TypeDecl * typeDecl );
+	virtual Declaration * mutate( TypedefDecl * typeDecl );
+	virtual AsmDecl * mutate( AsmDecl * asmDecl );
 
-	virtual CompoundStmt* mutate( CompoundStmt *compoundStmt );
-	virtual Statement* mutate( ExprStmt *exprStmt );
-	virtual Statement* mutate( AsmStmt *asmStmt );
-	virtual Statement* mutate( IfStmt *ifStmt );
-	virtual Statement* mutate( WhileStmt *whileStmt );
-	virtual Statement* mutate( ForStmt *forStmt );
-	virtual Statement* mutate( SwitchStmt *switchStmt );
-	virtual Statement* mutate( CaseStmt *caseStmt );
-	virtual Statement* mutate( BranchStmt *branchStmt );
-	virtual Statement* mutate( ReturnStmt *returnStmt );
-	virtual Statement* mutate( ThrowStmt *throwStmt );
-	virtual Statement* mutate( TryStmt *tryStmt );
-	virtual Statement* mutate( CatchStmt *catchStmt );
-	virtual Statement* mutate( FinallyStmt *catchStmt );
-	virtual Statement* mutate( WaitForStmt *waitforStmt );
-	virtual NullStmt* mutate( NullStmt *nullStmt );
-	virtual Statement* mutate( DeclStmt *declStmt );
-	virtual Statement* mutate( ImplicitCtorDtorStmt *impCtorDtorStmt );
+	virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
+	virtual Statement * mutate( ExprStmt * exprStmt );
+	virtual Statement * mutate( AsmStmt * asmStmt );
+	virtual Statement * mutate( IfStmt * ifStmt );
+	virtual Statement * mutate( WhileStmt * whileStmt );
+	virtual Statement * mutate( ForStmt * forStmt );
+	virtual Statement * mutate( SwitchStmt * switchStmt );
+	virtual Statement * mutate( CaseStmt * caseStmt );
+	virtual Statement * mutate( BranchStmt * branchStmt );
+	virtual Statement * mutate( ReturnStmt * returnStmt );
+	virtual Statement * mutate( ThrowStmt * throwStmt );
+	virtual Statement * mutate( TryStmt * tryStmt );
+	virtual Statement * mutate( CatchStmt * catchStmt );
+	virtual Statement * mutate( FinallyStmt * catchStmt );
+	virtual Statement * mutate( WaitForStmt * waitforStmt );
+	virtual NullStmt * mutate( NullStmt * nullStmt );
+	virtual Statement * mutate( DeclStmt * declStmt );
+	virtual Statement * mutate( ImplicitCtorDtorStmt * impCtorDtorStmt );
 
-	virtual Expression* mutate( ApplicationExpr *applicationExpr );
-	virtual Expression* mutate( UntypedExpr *untypedExpr );
-	virtual Expression* mutate( NameExpr *nameExpr );
-	virtual Expression* mutate( AddressExpr *castExpr );
-	virtual Expression* mutate( LabelAddressExpr *labAddressExpr );
-	virtual Expression* mutate( CastExpr *castExpr );
-	virtual Expression* mutate( VirtualCastExpr *castExpr );
-	virtual Expression* mutate( UntypedMemberExpr *memberExpr );
-	virtual Expression* mutate( MemberExpr *memberExpr );
-	virtual Expression* mutate( VariableExpr *variableExpr );
-	virtual Expression* mutate( ConstantExpr *constantExpr );
-	virtual Expression* mutate( SizeofExpr *sizeofExpr );
-	virtual Expression* mutate( AlignofExpr *alignofExpr );
-	virtual Expression* mutate( UntypedOffsetofExpr *offsetofExpr );
-	virtual Expression* mutate( OffsetofExpr *offsetofExpr );
-	virtual Expression* mutate( OffsetPackExpr *offsetPackExpr );
-	virtual Expression* mutate( AttrExpr *attrExpr );
-	virtual Expression* mutate( LogicalExpr *logicalExpr );
-	virtual Expression* mutate( ConditionalExpr *conditionalExpr );
-	virtual Expression* mutate( CommaExpr *commaExpr );
-	virtual Expression* mutate( TypeExpr *typeExpr );
-	virtual Expression* mutate( AsmExpr *asmExpr );
-	virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr );
-	virtual Expression* mutate( ConstructorExpr *ctorExpr );
-	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
-	virtual Expression* mutate( RangeExpr *rangeExpr );
-	virtual Expression* mutate( UntypedTupleExpr *tupleExpr );
-	virtual Expression* mutate( TupleExpr *tupleExpr );
-	virtual Expression* mutate( TupleIndexExpr *tupleExpr );
-	virtual Expression* mutate( TupleAssignExpr *assignExpr );
-	virtual Expression* mutate( StmtExpr * stmtExpr );
-	virtual Expression* mutate( UniqueExpr * uniqueExpr );
-	virtual Expression* mutate( UntypedInitExpr * initExpr );
-	virtual Expression* mutate( InitExpr * initExpr );
+	virtual Expression* mutate( ApplicationExpr * applicationExpr );
+	virtual Expression* mutate( UntypedExpr * untypedExpr );
+	virtual Expression* mutate( NameExpr * nameExpr );
+	virtual Expression* mutate( AddressExpr * castExpr );
+	virtual Expression* mutate( LabelAddressExpr * labAddressExpr );
+	virtual Expression* mutate( CastExpr * castExpr );
+	virtual Expression* mutate( VirtualCastExpr * castExpr );
+	virtual Expression* mutate( UntypedMemberExpr * memberExpr );
+	virtual Expression* mutate( MemberExpr * memberExpr );
+	virtual Expression* mutate( VariableExpr * variableExpr );
+	virtual Expression* mutate( ConstantExpr * constantExpr );
+	virtual Expression* mutate( SizeofExpr * sizeofExpr );
+	virtual Expression* mutate( AlignofExpr * alignofExpr );
+	virtual Expression* mutate( UntypedOffsetofExpr * offsetofExpr );
+	virtual Expression* mutate( OffsetofExpr * offsetofExpr );
+	virtual Expression* mutate( OffsetPackExpr * offsetPackExpr );
+	virtual Expression* mutate( AttrExpr * attrExpr );
+	virtual Expression* mutate( LogicalExpr * logicalExpr );
+	virtual Expression* mutate( ConditionalExpr * conditionalExpr );
+	virtual Expression* mutate( CommaExpr * commaExpr );
+	virtual Expression* mutate( TypeExpr * typeExpr );
+	virtual Expression* mutate( AsmExpr * asmExpr );
+	virtual Expression* mutate( ImplicitCopyCtorExpr * impCpCtorExpr );
+	virtual Expression* mutate( ConstructorExpr * ctorExpr );
+	virtual Expression* mutate( CompoundLiteralExpr * compLitExpr );
+	virtual Expression* mutate( RangeExpr * rangeExpr );
+	virtual Expression* mutate( UntypedTupleExpr * tupleExpr );
+	virtual Expression* mutate( TupleExpr * tupleExpr );
+	virtual Expression* mutate( TupleIndexExpr * tupleExpr );
+	virtual Expression* mutate( TupleAssignExpr * assignExpr );
+	virtual Expression* mutate( StmtExpr  * stmtExpr );
+	virtual Expression* mutate( UniqueExpr  * uniqueExpr );
+	virtual Expression* mutate( UntypedInitExpr  * initExpr );
+	virtual Expression* mutate( InitExpr  * initExpr );
 
-	virtual Type* mutate( VoidType *basicType );
-	virtual Type* mutate( BasicType *basicType );
-	virtual Type* mutate( PointerType *pointerType );
-	virtual Type* mutate( ArrayType *arrayType );
-	virtual Type* mutate( ReferenceType *refType );
-	virtual Type* mutate( FunctionType *functionType );
-	virtual Type* mutate( StructInstType *aggregateUseType );
-	virtual Type* mutate( UnionInstType *aggregateUseType );
-	virtual Type* mutate( EnumInstType *aggregateUseType );
-	virtual Type* mutate( TraitInstType *aggregateUseType );
-	virtual Type* mutate( TypeInstType *aggregateUseType );
-	virtual Type* mutate( TupleType *tupleType );
-	virtual Type* mutate( TypeofType *typeofType );
-	virtual Type* mutate( AttrType *attrType );
-	virtual Type* mutate( VarArgsType *varArgsType );
-	virtual Type* mutate( ZeroType *zeroType );
-	virtual Type* mutate( OneType *oneType );
+	virtual Type * mutate( VoidType * basicType );
+	virtual Type * mutate( BasicType * basicType );
+	virtual Type * mutate( PointerType * pointerType );
+	virtual Type * mutate( ArrayType * arrayType );
+	virtual Type * mutate( ReferenceType * refType );
+	virtual Type * mutate( FunctionType * functionType );
+	virtual Type * mutate( StructInstType * aggregateUseType );
+	virtual Type * mutate( UnionInstType * aggregateUseType );
+	virtual Type * mutate( EnumInstType * aggregateUseType );
+	virtual Type * mutate( TraitInstType * aggregateUseType );
+	virtual Type * mutate( TypeInstType * aggregateUseType );
+	virtual Type * mutate( TupleType * tupleType );
+	virtual Type * mutate( TypeofType * typeofType );
+	virtual Type * mutate( AttrType * attrType );
+	virtual Type * mutate( VarArgsType * varArgsType );
+	virtual Type * mutate( ZeroType * zeroType );
+	virtual Type * mutate( OneType * oneType );
 
-	virtual Designation* mutate( Designation *designation );
-	virtual Initializer* mutate( SingleInit *singleInit );
-	virtual Initializer* mutate( ListInit *listInit );
-	virtual Initializer* mutate( ConstructorInit *ctorInit );
+	virtual Designation * mutate( Designation * designation );
+	virtual Initializer * mutate( SingleInit * singleInit );
+	virtual Initializer * mutate( ListInit * listInit );
+	virtual Initializer * mutate( ConstructorInit * ctorInit );
 
-	virtual Subrange *mutate( Subrange *subrange );
+	virtual Subrange * mutate( Subrange * subrange );
 
-	virtual Constant *mutate( Constant *constant );
+	virtual Constant * mutate( Constant * constant );
+
+	virtual Attribute * mutate( Attribute * attribute );
   private:
-	virtual Declaration* handleAggregateDecl(AggregateDecl *aggregateDecl );
-	virtual Declaration* handleNamedTypeDecl(NamedTypeDecl *typeDecl );
-	virtual Type* handleReferenceToType(ReferenceToType *aggregateUseType );
+	virtual Declaration * handleAggregateDecl(AggregateDecl * aggregateDecl );
+	virtual Declaration * handleNamedTypeDecl(NamedTypeDecl * typeDecl );
+	virtual Type * handleReferenceToType(ReferenceToType * aggregateUseType );
 };
 
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision d67cdb749954789d84d7a8bbabc0ec601347a7bb)
+++ src/SynTree/Visitor.cc	(revision 7fc7cdbdb518babea2482db157b3a9e2122cddbf)
@@ -17,4 +17,5 @@
 #include <list>           // for list
 
+#include "Attribute.h"    // for Attribute
 #include "Constant.h"     // for Constant
 #include "Declaration.h"  // for DeclarationWithType, ObjectDecl, Declaration
@@ -35,4 +36,5 @@
 	maybeAccept( objectDecl->get_init(), *this );
 	maybeAccept( objectDecl->get_bitfieldWidth(), *this );
+	acceptAll( objectDecl->attributes, *this );
 }
 
@@ -40,4 +42,5 @@
 	maybeAccept( functionDecl->get_functionType(), *this );
 	maybeAccept( functionDecl->get_statements(), *this );
+	acceptAll( functionDecl->attributes, *this );
 }
 
@@ -487,8 +490,13 @@
 
 
-void Visitor::visit( __attribute__((unused)) Subrange *subrange ) {}
-
-
-void Visitor::visit( __attribute__((unused)) Constant *constant ) {}
+void Visitor::visit( Subrange * ) {}
+
+
+void Visitor::visit( Constant * ) {}
+
+void Visitor::visit( Attribute * attribute ) {
+	acceptAll( attribute->parameters, *this );
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision d67cdb749954789d84d7a8bbabc0ec601347a7bb)
+++ src/SynTree/Visitor.h	(revision 7fc7cdbdb518babea2482db157b3a9e2122cddbf)
@@ -27,94 +27,96 @@
 	// of the given syntax node, but performs no other action.
 
-	virtual void visit( ObjectDecl *objectDecl );
-	virtual void visit( FunctionDecl *functionDecl );
-	virtual void visit( StructDecl *aggregateDecl );
-	virtual void visit( UnionDecl *aggregateDecl );
-	virtual void visit( EnumDecl *aggregateDecl );
-	virtual void visit( TraitDecl *aggregateDecl );
-	virtual void visit( TypeDecl *typeDecl );
-	virtual void visit( TypedefDecl *typeDecl );
-	virtual void visit( AsmDecl *asmDecl );
+	virtual void visit( ObjectDecl * objectDecl );
+	virtual void visit( FunctionDecl * functionDecl );
+	virtual void visit( StructDecl * aggregateDecl );
+	virtual void visit( UnionDecl * aggregateDecl );
+	virtual void visit( EnumDecl * aggregateDecl );
+	virtual void visit( TraitDecl * aggregateDecl );
+	virtual void visit( TypeDecl * typeDecl );
+	virtual void visit( TypedefDecl * typeDecl );
+	virtual void visit( AsmDecl * asmDecl );
 
-	virtual void visit( CompoundStmt *compoundStmt );
-	virtual void visit( ExprStmt *exprStmt );
-	virtual void visit( AsmStmt *asmStmt );
-	virtual void visit( IfStmt *ifStmt );
-	virtual void visit( WhileStmt *whileStmt );
-	virtual void visit( ForStmt *forStmt );
-	virtual void visit( SwitchStmt *switchStmt );
-	virtual void visit( CaseStmt *caseStmt );
-	virtual void visit( BranchStmt *branchStmt );
-	virtual void visit( ReturnStmt *returnStmt );
-	virtual void visit( ThrowStmt *throwStmt );
-	virtual void visit( TryStmt *tryStmt );
-	virtual void visit( CatchStmt *catchStmt );
-	virtual void visit( FinallyStmt *finallyStmt );
-	virtual void visit( WaitForStmt *waitforStmt );
-	virtual void visit( NullStmt *nullStmt );
-	virtual void visit( DeclStmt *declStmt );
-	virtual void visit( ImplicitCtorDtorStmt *impCtorDtorStmt );
+	virtual void visit( CompoundStmt * compoundStmt );
+	virtual void visit( ExprStmt * exprStmt );
+	virtual void visit( AsmStmt * asmStmt );
+	virtual void visit( IfStmt * ifStmt );
+	virtual void visit( WhileStmt * whileStmt );
+	virtual void visit( ForStmt * forStmt );
+	virtual void visit( SwitchStmt * switchStmt );
+	virtual void visit( CaseStmt * caseStmt );
+	virtual void visit( BranchStmt * branchStmt );
+	virtual void visit( ReturnStmt * returnStmt );
+	virtual void visit( ThrowStmt * throwStmt );
+	virtual void visit( TryStmt * tryStmt );
+	virtual void visit( CatchStmt * catchStmt );
+	virtual void visit( FinallyStmt * finallyStmt );
+	virtual void visit( WaitForStmt * waitforStmt );
+	virtual void visit( NullStmt * nullStmt );
+	virtual void visit( DeclStmt * declStmt );
+	virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt );
 
-	virtual void visit( ApplicationExpr *applicationExpr );
-	virtual void visit( UntypedExpr *untypedExpr );
-	virtual void visit( NameExpr *nameExpr );
-	virtual void visit( CastExpr *castExpr );
-	virtual void visit( VirtualCastExpr *castExpr );
-	virtual void visit( AddressExpr *addressExpr );
-	virtual void visit( LabelAddressExpr *labAddressExpr );
-	virtual void visit( UntypedMemberExpr *memberExpr );
-	virtual void visit( MemberExpr *memberExpr );
-	virtual void visit( VariableExpr *variableExpr );
-	virtual void visit( ConstantExpr *constantExpr );
-	virtual void visit( SizeofExpr *sizeofExpr );
-	virtual void visit( AlignofExpr *alignofExpr );
-	virtual void visit( UntypedOffsetofExpr *offsetofExpr );
-	virtual void visit( OffsetofExpr *offsetofExpr );
-	virtual void visit( OffsetPackExpr *offsetPackExpr );
-	virtual void visit( AttrExpr *attrExpr );
-	virtual void visit( LogicalExpr *logicalExpr );
-	virtual void visit( ConditionalExpr *conditionalExpr );
-	virtual void visit( CommaExpr *commaExpr );
-	virtual void visit( TypeExpr *typeExpr );
-	virtual void visit( AsmExpr *asmExpr );
-	virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr );
-	virtual void visit( ConstructorExpr * ctorExpr );
-	virtual void visit( CompoundLiteralExpr *compLitExpr );
-	virtual void visit( RangeExpr *rangeExpr );
-	virtual void visit( UntypedTupleExpr *tupleExpr );
-	virtual void visit( TupleExpr *tupleExpr );
-	virtual void visit( TupleIndexExpr *tupleExpr );
-	virtual void visit( TupleAssignExpr *assignExpr );
-	virtual void visit( StmtExpr * stmtExpr );
-	virtual void visit( UniqueExpr * uniqueExpr );
-	virtual void visit( UntypedInitExpr * initExpr );
-	virtual void visit( InitExpr * initExpr );
+	virtual void visit( ApplicationExpr * applicationExpr );
+	virtual void visit( UntypedExpr * untypedExpr );
+	virtual void visit( NameExpr * nameExpr );
+	virtual void visit( CastExpr * castExpr );
+	virtual void visit( VirtualCastExpr * castExpr );
+	virtual void visit( AddressExpr * addressExpr );
+	virtual void visit( LabelAddressExpr * labAddressExpr );
+	virtual void visit( UntypedMemberExpr * memberExpr );
+	virtual void visit( MemberExpr * memberExpr );
+	virtual void visit( VariableExpr * variableExpr );
+	virtual void visit( ConstantExpr * constantExpr );
+	virtual void visit( SizeofExpr * sizeofExpr );
+	virtual void visit( AlignofExpr * alignofExpr );
+	virtual void visit( UntypedOffsetofExpr * offsetofExpr );
+	virtual void visit( OffsetofExpr * offsetofExpr );
+	virtual void visit( OffsetPackExpr * offsetPackExpr );
+	virtual void visit( AttrExpr * attrExpr );
+	virtual void visit( LogicalExpr * logicalExpr );
+	virtual void visit( ConditionalExpr * conditionalExpr );
+	virtual void visit( CommaExpr * commaExpr );
+	virtual void visit( TypeExpr * typeExpr );
+	virtual void visit( AsmExpr * asmExpr );
+	virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr );
+	virtual void visit( ConstructorExpr *  ctorExpr );
+	virtual void visit( CompoundLiteralExpr * compLitExpr );
+	virtual void visit( RangeExpr * rangeExpr );
+	virtual void visit( UntypedTupleExpr * tupleExpr );
+	virtual void visit( TupleExpr * tupleExpr );
+	virtual void visit( TupleIndexExpr * tupleExpr );
+	virtual void visit( TupleAssignExpr * assignExpr );
+	virtual void visit( StmtExpr *  stmtExpr );
+	virtual void visit( UniqueExpr *  uniqueExpr );
+	virtual void visit( UntypedInitExpr *  initExpr );
+	virtual void visit( InitExpr *  initExpr );
 
-	virtual void visit( VoidType *basicType );
-	virtual void visit( BasicType *basicType );
-	virtual void visit( PointerType *pointerType );
-	virtual void visit( ArrayType *arrayType );
-	virtual void visit( ReferenceType *refType );
-	virtual void visit( FunctionType *functionType );
-	virtual void visit( StructInstType *aggregateUseType );
-	virtual void visit( UnionInstType *aggregateUseType );
-	virtual void visit( EnumInstType *aggregateUseType );
-	virtual void visit( TraitInstType *aggregateUseType );
-	virtual void visit( TypeInstType *aggregateUseType );
-	virtual void visit( TupleType *tupleType );
-	virtual void visit( TypeofType *typeofType );
-	virtual void visit( AttrType *attrType );
-	virtual void visit( VarArgsType *varArgsType );
-	virtual void visit( ZeroType *zeroType );
-	virtual void visit( OneType *oneType );
+	virtual void visit( VoidType * basicType );
+	virtual void visit( BasicType * basicType );
+	virtual void visit( PointerType * pointerType );
+	virtual void visit( ArrayType * arrayType );
+	virtual void visit( ReferenceType * refType );
+	virtual void visit( FunctionType * functionType );
+	virtual void visit( StructInstType * aggregateUseType );
+	virtual void visit( UnionInstType * aggregateUseType );
+	virtual void visit( EnumInstType * aggregateUseType );
+	virtual void visit( TraitInstType * aggregateUseType );
+	virtual void visit( TypeInstType * aggregateUseType );
+	virtual void visit( TupleType * tupleType );
+	virtual void visit( TypeofType * typeofType );
+	virtual void visit( AttrType * attrType );
+	virtual void visit( VarArgsType * varArgsType );
+	virtual void visit( ZeroType * zeroType );
+	virtual void visit( OneType * oneType );
 
-	virtual void visit( Designation *designation );
-	virtual void visit( SingleInit *singleInit );
-	virtual void visit( ListInit *listInit );
-	virtual void visit( ConstructorInit *ctorInit );
+	virtual void visit( Designation * designation );
+	virtual void visit( SingleInit * singleInit );
+	virtual void visit( ListInit * listInit );
+	virtual void visit( ConstructorInit * ctorInit );
 
-	virtual void visit( Subrange *subrange );
+	virtual void visit( Subrange * subrange );
 
-	virtual void visit( Constant *constant );
+	virtual void visit( Constant * constant );
+
+	virtual void visit( Attribute * attribute );
   private:
 	virtual void handleAggregateDecl( AggregateDecl *aggregateDecl );
