Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/CodeGen/CodeGenerator.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -540,7 +540,10 @@
 		extension( nameExpr );
 		OperatorInfo opInfo;
-		if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
-			assert( opInfo.type == OT_CONSTANT );
-			output << opInfo.symbol;
+		if ( operatorLookup( nameExpr->name, opInfo ) ) {
+			if ( opInfo.type == OT_CONSTANT ) {
+				output << opInfo.symbol;
+			} else {
+				output << opInfo.outputName;
+			}
 		} else {
 			output << nameExpr->get_name();
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/Common/PassVisitor.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -10,4 +10,5 @@
 #include "SymTab/Indexer.h"
 
+#include "SynTree/Attribute.h"
 #include "SynTree/Initializer.h"
 #include "SynTree/Statement.h"
@@ -53,181 +54,185 @@
 	pass_type pass;
 
-	virtual void visit( ObjectDecl *objectDecl ) override final;
-	virtual void visit( FunctionDecl *functionDecl ) override final;
-	virtual void visit( StructDecl *aggregateDecl ) override final;
-	virtual void visit( UnionDecl *aggregateDecl ) override final;
-	virtual void visit( EnumDecl *aggregateDecl ) override final;
-	virtual void visit( TraitDecl *aggregateDecl ) override final;
-	virtual void visit( TypeDecl *typeDecl ) override final;
-	virtual void visit( TypedefDecl *typeDecl ) override final;
-	virtual void visit( AsmDecl *asmDecl ) override final;
-
-	virtual void visit( CompoundStmt *compoundStmt ) override final;
-	virtual void visit( ExprStmt *exprStmt ) override final;
-	virtual void visit( AsmStmt *asmStmt ) override final;
-	virtual void visit( IfStmt *ifStmt ) override final;
-	virtual void visit( WhileStmt *whileStmt ) override final;
-	virtual void visit( ForStmt *forStmt ) override final;
-	virtual void visit( SwitchStmt *switchStmt ) override final;
-	virtual void visit( CaseStmt *caseStmt ) override final;
-	virtual void visit( BranchStmt *branchStmt ) override final;
-	virtual void visit( ReturnStmt *returnStmt ) override final;
-	virtual void visit( ThrowStmt *throwStmt ) override final;
-	virtual void visit( TryStmt *tryStmt ) override final;
-	virtual void visit( CatchStmt *catchStmt ) override final;
-	virtual void visit( FinallyStmt *finallyStmt ) override final;
-	virtual void visit( WaitForStmt *waitforStmt ) override final;
-	virtual void visit( NullStmt *nullStmt ) override final;
-	virtual void visit( DeclStmt *declStmt ) override final;
-	virtual void visit( ImplicitCtorDtorStmt *impCtorDtorStmt ) override final;
-
-	virtual void visit( ApplicationExpr *applicationExpr ) override final;
-	virtual void visit( UntypedExpr *untypedExpr ) override final;
-	virtual void visit( NameExpr *nameExpr ) override final;
-	virtual void visit( CastExpr *castExpr ) override final;
-	virtual void visit( VirtualCastExpr *castExpr ) override final;
-	virtual void visit( AddressExpr *addressExpr ) override final;
-	virtual void visit( LabelAddressExpr *labAddressExpr ) override final;
-	virtual void visit( UntypedMemberExpr *memberExpr ) override final;
-	virtual void visit( MemberExpr *memberExpr ) override final;
-	virtual void visit( VariableExpr *variableExpr ) override final;
-	virtual void visit( ConstantExpr *constantExpr ) override final;
-	virtual void visit( SizeofExpr *sizeofExpr ) override final;
-	virtual void visit( AlignofExpr *alignofExpr ) override final;
-	virtual void visit( UntypedOffsetofExpr *offsetofExpr ) override final;
-	virtual void visit( OffsetofExpr *offsetofExpr ) override final;
-	virtual void visit( OffsetPackExpr *offsetPackExpr ) override final;
-	virtual void visit( AttrExpr *attrExpr ) override final;
-	virtual void visit( LogicalExpr *logicalExpr ) override final;
-	virtual void visit( ConditionalExpr *conditionalExpr ) override final;
-	virtual void visit( CommaExpr *commaExpr ) override final;
-	virtual void visit( TypeExpr *typeExpr ) override final;
-	virtual void visit( AsmExpr *asmExpr ) override final;
-	virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr ) override final;
-	virtual void visit( ConstructorExpr * ctorExpr ) override final;
-	virtual void visit( CompoundLiteralExpr *compLitExpr ) override final;
-	virtual void visit( RangeExpr *rangeExpr ) override final;
-	virtual void visit( UntypedTupleExpr *tupleExpr ) override final;
-	virtual void visit( TupleExpr *tupleExpr ) override final;
-	virtual void visit( TupleIndexExpr *tupleExpr ) override final;
-	virtual void visit( TupleAssignExpr *assignExpr ) override final;
-	virtual void visit( StmtExpr * stmtExpr ) override final;
-	virtual void visit( UniqueExpr * uniqueExpr ) override final;
-
-	virtual void visit( VoidType *basicType ) override final;
-	virtual void visit( BasicType *basicType ) override final;
-	virtual void visit( PointerType *pointerType ) override final;
-	virtual void visit( ArrayType *arrayType ) override final;
-	virtual void visit( ReferenceType *referenceType ) override final;
-	virtual void visit( FunctionType *functionType ) override final;
-	virtual void visit( StructInstType *aggregateUseType ) override final;
-	virtual void visit( UnionInstType *aggregateUseType ) override final;
-	virtual void visit( EnumInstType *aggregateUseType ) override final;
-	virtual void visit( TraitInstType *aggregateUseType ) override final;
-	virtual void visit( TypeInstType *aggregateUseType ) override final;
-	virtual void visit( TupleType *tupleType ) override final;
-	virtual void visit( TypeofType *typeofType ) override final;
-	virtual void visit( AttrType *attrType ) override final;
-	virtual void visit( VarArgsType *varArgsType ) override final;
-	virtual void visit( ZeroType *zeroType ) override final;
-	virtual void visit( OneType *oneType ) override final;
-
-	virtual void visit( Designation *designation ) override final;
-	virtual void visit( SingleInit *singleInit ) override final;
-	virtual void visit( ListInit *listInit ) override final;
-	virtual void visit( ConstructorInit *ctorInit ) override final;
-
-	virtual void visit( Subrange *subrange ) override final;
-
-	virtual void visit( Constant *constant ) override final;
-
-	virtual DeclarationWithType* mutate( ObjectDecl *objectDecl ) override final;
-	virtual DeclarationWithType* mutate( FunctionDecl *functionDecl ) override final;
-	virtual Declaration* mutate( StructDecl *aggregateDecl ) override final;
-	virtual Declaration* mutate( UnionDecl *aggregateDecl ) override final;
-	virtual Declaration* mutate( EnumDecl *aggregateDecl ) override final;
-	virtual Declaration* mutate( TraitDecl *aggregateDecl ) override final;
-	virtual Declaration* mutate( TypeDecl *typeDecl ) override final;
-	virtual Declaration* mutate( TypedefDecl *typeDecl ) override final;
-	virtual AsmDecl* mutate( AsmDecl *asmDecl ) override final;
-
-	virtual CompoundStmt* mutate( CompoundStmt *compoundStmt ) override final;
-	virtual Statement* mutate( ExprStmt *exprStmt ) override final;
-	virtual Statement* mutate( AsmStmt *asmStmt ) override final;
-	virtual Statement* mutate( IfStmt *ifStmt ) override final;
-	virtual Statement* mutate( WhileStmt *whileStmt ) override final;
-	virtual Statement* mutate( ForStmt *forStmt ) override final;
-	virtual Statement* mutate( SwitchStmt *switchStmt ) override final;
-	virtual Statement* mutate( CaseStmt *caseStmt ) override final;
-	virtual Statement* mutate( BranchStmt *branchStmt ) override final;
-	virtual Statement* mutate( ReturnStmt *returnStmt ) override final;
-	virtual Statement* mutate( ThrowStmt *throwStmt ) override final;
-	virtual Statement* mutate( TryStmt *tryStmt ) override final;
-	virtual Statement* mutate( CatchStmt *catchStmt ) override final;
-	virtual Statement* mutate( FinallyStmt *finallyStmt ) override final;
-	virtual Statement* mutate( WaitForStmt *waitforStmt ) override final;
-	virtual NullStmt* mutate( NullStmt *nullStmt ) override final;
-	virtual Statement* mutate( DeclStmt *declStmt ) override final;
-	virtual Statement* mutate( ImplicitCtorDtorStmt *impCtorDtorStmt ) override final;
-
-	virtual Expression* mutate( ApplicationExpr *applicationExpr ) override final;
-	virtual Expression* mutate( UntypedExpr *untypedExpr ) override final;
-	virtual Expression* mutate( NameExpr *nameExpr ) override final;
-	virtual Expression* mutate( AddressExpr *castExpr ) override final;
-	virtual Expression* mutate( LabelAddressExpr *labAddressExpr ) override final;
-	virtual Expression* mutate( CastExpr *castExpr ) override final;
-	virtual Expression* mutate( VirtualCastExpr *castExpr ) override final;
-	virtual Expression* mutate( UntypedMemberExpr *memberExpr ) override final;
-	virtual Expression* mutate( MemberExpr *memberExpr ) override final;
-	virtual Expression* mutate( VariableExpr *variableExpr ) override final;
-	virtual Expression* mutate( ConstantExpr *constantExpr ) override final;
-	virtual Expression* mutate( SizeofExpr *sizeofExpr ) override final;
-	virtual Expression* mutate( AlignofExpr *alignofExpr ) override final;
-	virtual Expression* mutate( UntypedOffsetofExpr *offsetofExpr ) override final;
-	virtual Expression* mutate( OffsetofExpr *offsetofExpr ) override final;
-	virtual Expression* mutate( OffsetPackExpr *offsetPackExpr ) override final;
-	virtual Expression* mutate( AttrExpr *attrExpr ) override final;
-	virtual Expression* mutate( LogicalExpr *logicalExpr ) override final;
-	virtual Expression* mutate( ConditionalExpr *conditionalExpr ) override final;
-	virtual Expression* mutate( CommaExpr *commaExpr ) override final;
-	virtual Expression* mutate( TypeExpr *typeExpr ) override final;
-	virtual Expression* mutate( AsmExpr *asmExpr ) override final;
-	virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) override final;
-	virtual Expression* mutate( ConstructorExpr *ctorExpr ) override final;
-	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ) override final;
-	virtual Expression* mutate( RangeExpr *rangeExpr ) override final;
-	virtual Expression* mutate( UntypedTupleExpr *tupleExpr ) override final;
-	virtual Expression* mutate( TupleExpr *tupleExpr ) override final;
-	virtual Expression* mutate( TupleIndexExpr *tupleExpr ) override final;
-	virtual Expression* mutate( TupleAssignExpr *assignExpr ) override final;
-	virtual Expression* mutate( StmtExpr * stmtExpr ) override final;
-	virtual Expression* mutate( UniqueExpr * uniqueExpr ) override final;
-
-	virtual Type* mutate( VoidType *basicType ) override final;
-	virtual Type* mutate( BasicType *basicType ) override final;
-	virtual Type* mutate( PointerType *pointerType ) override final;
-	virtual Type* mutate( ArrayType *arrayType ) override final;
-	virtual Type* mutate( ReferenceType *referenceType ) override final;
-	virtual Type* mutate( FunctionType *functionType ) override final;
-	virtual Type* mutate( StructInstType *aggregateUseType ) override final;
-	virtual Type* mutate( UnionInstType *aggregateUseType ) override final;
-	virtual Type* mutate( EnumInstType *aggregateUseType ) override final;
-	virtual Type* mutate( TraitInstType *aggregateUseType ) override final;
-	virtual Type* mutate( TypeInstType *aggregateUseType ) override final;
-	virtual Type* mutate( TupleType *tupleType ) override final;
-	virtual Type* mutate( TypeofType *typeofType ) override final;
-	virtual Type* mutate( AttrType *attrType ) override final;
-	virtual Type* mutate( VarArgsType *varArgsType ) override final;
-	virtual Type* mutate( ZeroType *zeroType ) override final;
-	virtual Type* mutate( OneType *oneType ) override final;
-
-	virtual Designation* mutate( Designation *designation ) override final;
-	virtual Initializer* mutate( SingleInit *singleInit ) override final;
-	virtual Initializer* mutate( ListInit *listInit ) override final;
-	virtual Initializer* mutate( ConstructorInit *ctorInit ) override final;
-
-	virtual Subrange *mutate( Subrange *subrange ) override final;
-
-	virtual Constant *mutate( Constant *constant ) override final;
+	virtual void visit( ObjectDecl * objectDecl ) override final;
+	virtual void visit( FunctionDecl * functionDecl ) override final;
+	virtual void visit( StructDecl * aggregateDecl ) override final;
+	virtual void visit( UnionDecl * aggregateDecl ) override final;
+	virtual void visit( EnumDecl * aggregateDecl ) override final;
+	virtual void visit( TraitDecl * aggregateDecl ) override final;
+	virtual void visit( TypeDecl * typeDecl ) override final;
+	virtual void visit( TypedefDecl * typeDecl ) override final;
+	virtual void visit( AsmDecl * asmDecl ) override final;
+
+	virtual void visit( CompoundStmt * compoundStmt ) override final;
+	virtual void visit( ExprStmt * exprStmt ) override final;
+	virtual void visit( AsmStmt * asmStmt ) override final;
+	virtual void visit( IfStmt * ifStmt ) override final;
+	virtual void visit( WhileStmt * whileStmt ) override final;
+	virtual void visit( ForStmt * forStmt ) override final;
+	virtual void visit( SwitchStmt * switchStmt ) override final;
+	virtual void visit( CaseStmt * caseStmt ) override final;
+	virtual void visit( BranchStmt * branchStmt ) override final;
+	virtual void visit( ReturnStmt * returnStmt ) override final;
+	virtual void visit( ThrowStmt * throwStmt ) override final;
+	virtual void visit( TryStmt * tryStmt ) override final;
+	virtual void visit( CatchStmt * catchStmt ) override final;
+	virtual void visit( FinallyStmt * finallyStmt ) override final;
+	virtual void visit( WaitForStmt * waitforStmt ) override final;
+	virtual void visit( NullStmt * nullStmt ) override final;
+	virtual void visit( DeclStmt * declStmt ) override final;
+	virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
+
+	virtual void visit( ApplicationExpr * applicationExpr ) override final;
+	virtual void visit( UntypedExpr * untypedExpr ) override final;
+	virtual void visit( NameExpr * nameExpr ) override final;
+	virtual void visit( CastExpr * castExpr ) override final;
+	virtual void visit( VirtualCastExpr * castExpr ) override final;
+	virtual void visit( AddressExpr * addressExpr ) override final;
+	virtual void visit( LabelAddressExpr * labAddressExpr ) override final;
+	virtual void visit( UntypedMemberExpr * memberExpr ) override final;
+	virtual void visit( MemberExpr * memberExpr ) override final;
+	virtual void visit( VariableExpr * variableExpr ) override final;
+	virtual void visit( ConstantExpr * constantExpr ) override final;
+	virtual void visit( SizeofExpr * sizeofExpr ) override final;
+	virtual void visit( AlignofExpr * alignofExpr ) override final;
+	virtual void visit( UntypedOffsetofExpr * offsetofExpr ) override final;
+	virtual void visit( OffsetofExpr * offsetofExpr ) override final;
+	virtual void visit( OffsetPackExpr * offsetPackExpr ) override final;
+	virtual void visit( AttrExpr * attrExpr ) override final;
+	virtual void visit( LogicalExpr * logicalExpr ) override final;
+	virtual void visit( ConditionalExpr * conditionalExpr ) override final;
+	virtual void visit( CommaExpr * commaExpr ) override final;
+	virtual void visit( TypeExpr * typeExpr ) override final;
+	virtual void visit( AsmExpr * asmExpr ) override final;
+	virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override final;
+	virtual void visit( ConstructorExpr *  ctorExpr ) override final;
+	virtual void visit( CompoundLiteralExpr * compLitExpr ) override final;
+	virtual void visit( RangeExpr * rangeExpr ) override final;
+	virtual void visit( UntypedTupleExpr * tupleExpr ) override final;
+	virtual void visit( TupleExpr * tupleExpr ) override final;
+	virtual void visit( TupleIndexExpr * tupleExpr ) override final;
+	virtual void visit( TupleAssignExpr * assignExpr ) override final;
+	virtual void visit( StmtExpr *  stmtExpr ) override final;
+	virtual void visit( UniqueExpr *  uniqueExpr ) override final;
+
+	virtual void visit( VoidType * basicType ) override final;
+	virtual void visit( BasicType * basicType ) override final;
+	virtual void visit( PointerType * pointerType ) override final;
+	virtual void visit( ArrayType * arrayType ) override final;
+	virtual void visit( ReferenceType * referenceType ) override final;
+	virtual void visit( FunctionType * functionType ) override final;
+	virtual void visit( StructInstType * aggregateUseType ) override final;
+	virtual void visit( UnionInstType * aggregateUseType ) override final;
+	virtual void visit( EnumInstType * aggregateUseType ) override final;
+	virtual void visit( TraitInstType * aggregateUseType ) override final;
+	virtual void visit( TypeInstType * aggregateUseType ) override final;
+	virtual void visit( TupleType * tupleType ) override final;
+	virtual void visit( TypeofType * typeofType ) override final;
+	virtual void visit( AttrType * attrType ) override final;
+	virtual void visit( VarArgsType * varArgsType ) override final;
+	virtual void visit( ZeroType * zeroType ) override final;
+	virtual void visit( OneType * oneType ) override final;
+
+	virtual void visit( Designation * designation ) override final;
+	virtual void visit( SingleInit * singleInit ) override final;
+	virtual void visit( ListInit * listInit ) override final;
+	virtual void visit( ConstructorInit * ctorInit ) override final;
+
+	virtual void visit( Subrange * subrange ) override final;
+
+	virtual void visit( Constant * constant ) override final;
+
+	virtual void visit( Attribute * attribute ) override final;
+
+	virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override final;
+	virtual DeclarationWithType * mutate( FunctionDecl * functionDecl ) override final;
+	virtual Declaration * mutate( StructDecl * aggregateDecl ) override final;
+	virtual Declaration * mutate( UnionDecl * aggregateDecl ) override final;
+	virtual Declaration * mutate( EnumDecl * aggregateDecl ) override final;
+	virtual Declaration * mutate( TraitDecl * aggregateDecl ) override final;
+	virtual Declaration * mutate( TypeDecl * typeDecl ) override final;
+	virtual Declaration * mutate( TypedefDecl * typeDecl ) override final;
+	virtual AsmDecl * mutate( AsmDecl * asmDecl ) override final;
+
+	virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override final;
+	virtual Statement * mutate( ExprStmt * exprStmt ) override final;
+	virtual Statement * mutate( AsmStmt * asmStmt ) override final;
+	virtual Statement * mutate( IfStmt * ifStmt ) override final;
+	virtual Statement * mutate( WhileStmt * whileStmt ) override final;
+	virtual Statement * mutate( ForStmt * forStmt ) override final;
+	virtual Statement * mutate( SwitchStmt * switchStmt ) override final;
+	virtual Statement * mutate( CaseStmt * caseStmt ) override final;
+	virtual Statement * mutate( BranchStmt * branchStmt ) override final;
+	virtual Statement * mutate( ReturnStmt * returnStmt ) override final;
+	virtual Statement * mutate( ThrowStmt * throwStmt ) override final;
+	virtual Statement * mutate( TryStmt * tryStmt ) override final;
+	virtual Statement * mutate( CatchStmt * catchStmt ) override final;
+	virtual Statement * mutate( FinallyStmt * finallyStmt ) override final;
+	virtual Statement * mutate( WaitForStmt * waitforStmt ) override final;
+	virtual NullStmt * mutate( NullStmt * nullStmt ) override final;
+	virtual Statement * mutate( DeclStmt * declStmt ) override final;
+	virtual Statement * mutate( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;
+
+	virtual Expression * mutate( ApplicationExpr * applicationExpr ) override final;
+	virtual Expression * mutate( UntypedExpr * untypedExpr ) override final;
+	virtual Expression * mutate( NameExpr * nameExpr ) override final;
+	virtual Expression * mutate( AddressExpr * castExpr ) override final;
+	virtual Expression * mutate( LabelAddressExpr * labAddressExpr ) override final;
+	virtual Expression * mutate( CastExpr * castExpr ) override final;
+	virtual Expression * mutate( VirtualCastExpr * castExpr ) override final;
+	virtual Expression * mutate( UntypedMemberExpr * memberExpr ) override final;
+	virtual Expression * mutate( MemberExpr * memberExpr ) override final;
+	virtual Expression * mutate( VariableExpr * variableExpr ) override final;
+	virtual Expression * mutate( ConstantExpr * constantExpr ) override final;
+	virtual Expression * mutate( SizeofExpr * sizeofExpr ) override final;
+	virtual Expression * mutate( AlignofExpr * alignofExpr ) override final;
+	virtual Expression * mutate( UntypedOffsetofExpr * offsetofExpr ) override final;
+	virtual Expression * mutate( OffsetofExpr * offsetofExpr ) override final;
+	virtual Expression * mutate( OffsetPackExpr * offsetPackExpr ) override final;
+	virtual Expression * mutate( AttrExpr * attrExpr ) override final;
+	virtual Expression * mutate( LogicalExpr * logicalExpr ) override final;
+	virtual Expression * mutate( ConditionalExpr * conditionalExpr ) override final;
+	virtual Expression * mutate( CommaExpr * commaExpr ) override final;
+	virtual Expression * mutate( TypeExpr * typeExpr ) override final;
+	virtual Expression * mutate( AsmExpr * asmExpr ) override final;
+	virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr ) override final;
+	virtual Expression * mutate( ConstructorExpr * ctorExpr ) override final;
+	virtual Expression * mutate( CompoundLiteralExpr * compLitExpr ) override final;
+	virtual Expression * mutate( RangeExpr * rangeExpr ) override final;
+	virtual Expression * mutate( UntypedTupleExpr * tupleExpr ) override final;
+	virtual Expression * mutate( TupleExpr * tupleExpr ) override final;
+	virtual Expression * mutate( TupleIndexExpr * tupleExpr ) override final;
+	virtual Expression * mutate( TupleAssignExpr * assignExpr ) override final;
+	virtual Expression * mutate( StmtExpr *  stmtExpr ) override final;
+	virtual Expression * mutate( UniqueExpr *  uniqueExpr ) override final;
+
+	virtual Type * mutate( VoidType * basicType ) override final;
+	virtual Type * mutate( BasicType * basicType ) override final;
+	virtual Type * mutate( PointerType * pointerType ) override final;
+	virtual Type * mutate( ArrayType * arrayType ) override final;
+	virtual Type * mutate( ReferenceType * referenceType ) override final;
+	virtual Type * mutate( FunctionType * functionType ) override final;
+	virtual Type * mutate( StructInstType * aggregateUseType ) override final;
+	virtual Type * mutate( UnionInstType * aggregateUseType ) override final;
+	virtual Type * mutate( EnumInstType * aggregateUseType ) override final;
+	virtual Type * mutate( TraitInstType * aggregateUseType ) override final;
+	virtual Type * mutate( TypeInstType * aggregateUseType ) override final;
+	virtual Type * mutate( TupleType * tupleType ) override final;
+	virtual Type * mutate( TypeofType * typeofType ) override final;
+	virtual Type * mutate( AttrType * attrType ) override final;
+	virtual Type * mutate( VarArgsType * varArgsType ) override final;
+	virtual Type * mutate( ZeroType * zeroType ) override final;
+	virtual Type * mutate( OneType * oneType ) override final;
+
+	virtual Designation * mutate( Designation * designation ) override final;
+	virtual Initializer * mutate( SingleInit * singleInit ) override final;
+	virtual Initializer * mutate( ListInit * listInit ) override final;
+	virtual Initializer * mutate( ConstructorInit * ctorInit ) override final;
+
+	virtual Subrange * mutate( Subrange * subrange ) override final;
+
+	virtual Constant * mutate( Constant * constant ) override final;
+
+	virtual Attribute * mutate( Attribute * attribute ) override final;
 
 private:
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/Common/PassVisitor.impl.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -321,4 +321,5 @@
 	maybeAccept        ( node->init         , *this );
 	maybeAccept        ( node->bitfieldWidth, *this );
+	maybeAccept        ( node->attributes   , *this );
 
 	if ( node->name != "" ) {
@@ -336,4 +337,5 @@
 	maybeMutateRef     ( node->init         , *this );
 	maybeMutateRef     ( node->bitfieldWidth, *this );
+	maybeMutateRef     ( node->attributes   , *this );
 
 	if ( node->name != "" ) {
@@ -358,4 +360,5 @@
 		maybeAccept( node->type, *this );
 		maybeAccept( node->statements, *this );
+		maybeAccept( node->attributes, *this );
 	}
 
@@ -375,4 +378,5 @@
 		maybeMutateRef( node->type, *this );
 		maybeMutateRef( node->statements, *this );
+		maybeMutateRef( node->attributes, *this );
 	}
 
@@ -1984,4 +1988,9 @@
 }
 
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( Attribute * node ) {
+	VISIT_BODY( node );
+}
+
 //---------------------------------------------------------------------------------------------------------------
 template< typename pass_type >
@@ -2069,2 +2078,7 @@
 	MUTATE_BODY( Constant, node );
 }
+
+template< typename pass_type >
+Attribute * PassVisitor< pass_type >::mutate( Attribute * node  )  {
+	MUTATE_BODY( Attribute, node );
+}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/InitTweak/FixInit.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -213,10 +213,10 @@
 			void emit( CodeLocation, const Params &... params );
 
-			FunctionDecl * function = 0;
+			FunctionDecl * function = nullptr;
 			std::set< DeclarationWithType * > unhandled;
 			std::map< DeclarationWithType *, CodeLocation > usedUninit;
-			ObjectDecl * thisParam = 0;
+			ObjectDecl * thisParam = nullptr;
 			bool isCtor = false; // true if current function is a constructor
-			StructDecl * structDecl = 0;
+			StructDecl * structDecl = nullptr;
 		};
 
@@ -750,14 +750,14 @@
 					} else {
 						ImplicitCtorDtorStmt * implicit = strict_dynamic_cast< ImplicitCtorDtorStmt * > ( ctor );
-						ExprStmt * ctorStmt = dynamic_cast< ExprStmt * >( implicit->get_callStmt() );
+						ExprStmt * ctorStmt = dynamic_cast< ExprStmt * >( implicit->callStmt );
 						ApplicationExpr * ctorCall = nullptr;
-						if ( ctorStmt && (ctorCall = isIntrinsicCallExpr( ctorStmt->get_expr() )) && ctorCall->get_args().size() == 2 ) {
+						if ( ctorStmt && (ctorCall = isIntrinsicCallExpr( ctorStmt->expr )) && ctorCall->get_args().size() == 2 ) {
 							// clean up intrinsic copy constructor calls by making them into SingleInits
-							objDecl->set_init( new SingleInit( ctorCall->get_args().back() ) );
-							ctorCall->get_args().pop_back();
+							objDecl->init = new SingleInit( ctorCall->args.back() );
+							ctorCall->args.pop_back();
 						} else {
 							stmtsToAddAfter.push_back( ctor );
-							objDecl->set_init( nullptr );
-							ctorInit->set_ctor( nullptr );
+							objDecl->init = nullptr;
+							ctorInit->ctor = nullptr;
 						}
 
@@ -777,10 +777,10 @@
 						}
 					} // if
-				} else if ( Initializer * init = ctorInit->get_init() ) {
-					objDecl->set_init( init );
-					ctorInit->set_init( nullptr );
+				} else if ( Initializer * init = ctorInit->init ) {
+					objDecl->init = init;
+					ctorInit->init = nullptr;
 				} else {
 					// no constructor and no initializer, which is okay
-					objDecl->set_init( nullptr );
+					objDecl->init = nullptr;
 				} // if
 				delete ctorInit;
@@ -880,6 +880,19 @@
 		}
 
+		void addIds( SymTab::Indexer & indexer, const std::list< DeclarationWithType * > & decls ) {
+			for ( auto d : decls ) {
+				indexer.addId( d );
+			}
+		}
+
+		void addTypes( SymTab::Indexer & indexer, const std::list< TypeDecl * > & tds ) {
+			for ( auto td : tds ) {
+				indexer.addType( td );
+				addIds( indexer, td->assertions );
+			}
+		}
+
 		void GenStructMemberCalls::previsit( FunctionDecl * funcDecl ) {
-			GuardValue( funcDecl );
+			GuardValue( function );
 			GuardValue( unhandled );
 			GuardValue( usedUninit );
@@ -914,17 +927,4 @@
 		}
 
-		void addIds( SymTab::Indexer & indexer, const std::list< DeclarationWithType * > & decls ) {
-			for ( auto d : decls ) {
-				indexer.addId( d );
-			}
-		}
-
-		void addTypes( SymTab::Indexer & indexer, const std::list< TypeDecl * > & tds ) {
-			for ( auto td : tds ) {
-				indexer.addType( td );
-				addIds( indexer, td->assertions );
-			}
-		}
-
 		void GenStructMemberCalls::postvisit( FunctionDecl * funcDecl ) {
 			// remove the unhandled objects from usedUninit, because a call is inserted
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/InitTweak/InitTweak.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -270,4 +270,18 @@
 	}
 
+	Type * getThisType( FunctionType * ftype ) {
+		assertf( ftype, "getThisType: nullptr ftype" );
+		ObjectDecl * thisParam = getThisParam( ftype );
+		ReferenceType * refType = strict_dynamic_cast< ReferenceType * >( thisParam->type );
+		return refType->base;
+	}
+
+	ObjectDecl * getThisParam( FunctionType * ftype ) {
+		assertf( ftype, "getThisParam: nullptr ftype" );
+		auto & params = ftype->parameters;
+		assertf( ! params.empty(), "getThisParam: ftype with 0 parameters: %s", toString( ftype ).c_str() );
+		return strict_dynamic_cast< ObjectDecl * >( params.front() );
+	}
+
 	bool tryConstruct( DeclarationWithType * dwt ) {
 		ObjectDecl * objDecl = dynamic_cast< ObjectDecl * >( dwt );
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/InitTweak/InitTweak.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -29,4 +29,10 @@
 	FunctionDecl * isCopyConstructor( Declaration * decl );
 	FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname );
+
+	/// returns the base type of the first parameter to a constructor/destructor/assignment function
+	Type * getThisType( FunctionType * ftype );
+
+	/// returns the first parameter of a constructor/destructor/assignment function
+	ObjectDecl * getThisParam( FunctionType * ftype );
 
 	/// transform Initializer into an argument list that can be passed to a call expression
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -174,7 +174,7 @@
 	}
 
-	void AlternativeFinder::find( Expression *expr, bool adjust, bool prune ) {
+	void AlternativeFinder::find( Expression *expr, bool adjust, bool prune, bool failFast ) {
 		expr->accept( *this );
-		if ( alternatives.empty() ) {
+		if ( failFast && alternatives.empty() ) {
 			throw SemanticError( "No reasonable alternatives for expression ", expr );
 		}
@@ -191,5 +191,5 @@
 			AltList::iterator oldBegin = alternatives.begin();
 			pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ) );
-			if ( alternatives.begin() == oldBegin ) {
+			if ( failFast && alternatives.begin() == oldBegin ) {
 				std::ostringstream stream;
 				AltList winners;
@@ -214,6 +214,14 @@
 	}
 
-	void AlternativeFinder::findWithAdjustment( Expression *expr, bool prune ) {
-		find( expr, true, prune );
+	void AlternativeFinder::findWithAdjustment( Expression *expr ) {
+		find( expr, true );
+	}
+
+	void AlternativeFinder::findWithoutPrune( Expression * expr ) {
+		find( expr, true, false );
+	}
+
+	void AlternativeFinder::maybeFind( Expression * expr ) {
+		find( expr, true, true, false );
 	}
 
@@ -714,11 +722,8 @@
 
 		// find function operators
+		static NameExpr *opExpr = new NameExpr( "?()" );
 		AlternativeFinder funcOpFinder( indexer, env );
-		NameExpr *opExpr = new NameExpr( "?()" );
-		try {
-			funcOpFinder.findWithAdjustment( opExpr );
-		} catch( SemanticError &e ) {
-			// it's ok if there aren't any defined function ops
-		}
+		// it's ok if there aren't any defined function ops
+		funcOpFinder.maybeFind( opExpr);
 		PRINT(
 			std::cerr << "known function ops:" << std::endl;
@@ -928,6 +933,5 @@
 		AlternativeFinder finder( indexer, env );
 		// don't prune here, since it's guaranteed all alternatives will have the same type
-		// (giving the alternatives different types is half of the point of ConstructorExpr nodes)
-		finder.findWithAdjustment( castExpr->get_arg(), false );
+		finder.findWithoutPrune( castExpr->get_arg() );
 		for ( Alternative & alt : finder.alternatives ) {
 			alternatives.push_back( Alternative(
@@ -1226,5 +1230,5 @@
 		// don't prune here, since it's guaranteed all alternatives will have the same type
 		// (giving the alternatives different types is half of the point of ConstructorExpr nodes)
-		finder.findWithAdjustment( ctorExpr->get_callExpr(), false );
+		finder.findWithoutPrune( ctorExpr->get_callExpr() );
 		for ( Alternative & alt : finder.alternatives ) {
 			alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) );
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/ResolvExpr/AlternativeFinder.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -34,7 +34,11 @@
 	  public:
 		AlternativeFinder( const SymTab::Indexer &indexer, const TypeEnvironment &env );
-		void find( Expression *expr, bool adjust = false, bool prune = true );
+		void find( Expression *expr, bool adjust = false, bool prune = true, bool failFast = true );
 		/// Calls find with the adjust flag set; adjustment turns array and function types into equivalent pointer types
-		void findWithAdjustment( Expression *expr, bool prune = true );
+		void findWithAdjustment( Expression *expr );
+		/// Calls find with the adjust flag set and prune flag unset; pruning ensures there is at most one alternative per result type
+		void findWithoutPrune( Expression *expr );
+		/// Calls find with the adjust and prune flags set, failFast flags unset; fail fast ensures that there is at least one resulting alternative
+		void maybeFind( Expression *expr );
 		AltList &get_alternatives() { return alternatives; }
 
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SymTab/Autogen.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -119,5 +119,4 @@
 		ObjectDecl *dstParam = new ObjectDecl( "_dst", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), paramType->clone() ), nullptr );
 		ftype->get_parameters().push_back( dstParam );
-
 		return ftype;
 	}
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SymTab/Autogen.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -44,6 +44,12 @@
 	extern FunctionDecl * dereferenceOperator;
 
-	// temporary
+	// generate the type of an assignment function for paramType
 	FunctionType * genAssignType( Type * paramType );
+
+	// generate the type of a default constructor or destructor for paramType
+	FunctionType * genDefaultType( Type * paramType );
+
+	// generate the type of a copy constructor for paramType
+	FunctionType * genDefaultType( Type * paramType );
 
 	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
Index: src/SynTree/Attribute.h
===================================================================
--- src/SynTree/Attribute.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Attribute.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -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 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/BaseSyntaxNode.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -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/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Declaration.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -164,4 +164,6 @@
 	CompoundStmt *get_statements() const { return statements; }
 	void set_statements( CompoundStmt *newValue ) { statements = newValue; }
+
+	static FunctionDecl * newFunction( const std::string & name, FunctionType * type, CompoundStmt * statements );
 
 	virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); }
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/FunctionDecl.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -26,4 +26,5 @@
 #include "Statement.h"           // for CompoundStmt
 #include "Type.h"                // for Type, FunctionType, Type::FuncSpecif...
+#include "VarExprReplacer.h"
 
 extern bool translation_unit_nomain;
@@ -39,4 +40,16 @@
 FunctionDecl::FunctionDecl( const FunctionDecl &other )
 		: Parent( other ), type( maybeClone( other.type ) ), statements( maybeClone( other.statements ) ) {
+
+	VarExprReplacer::DeclMap declMap;
+	for ( auto p : group_iterate( other.type->parameters, type->parameters ) ) {
+		declMap[ std::get<0>(p) ] = std::get<1>(p);
+	}
+	for ( auto p : group_iterate( other.type->returnVals, type->returnVals ) ) {
+		declMap[ std::get<0>(p) ] = std::get<1>(p);
+	}
+	if ( ! declMap.empty() ) {
+		VarExprReplacer replacer( declMap );
+		accept( replacer );
+	}
 }
 
@@ -44,4 +57,8 @@
 	delete type;
 	delete statements;
+}
+
+FunctionDecl * FunctionDecl::newFunction( const std::string & name, FunctionType * type, CompoundStmt * statements ) {
+	return new FunctionDecl( name, Type::StorageClasses(), LinkageSpec::C, type, statements );
 }
 
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Initializer.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -117,4 +117,7 @@
 	Statement * ctor;
 	Statement * dtor;
+	// C-style initializer made up of SingleInit and ListInit nodes to use as a fallback
+	// if an appropriate constructor definition is not found by the resolver
+	Initializer * init;
 
 	ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init );
@@ -135,7 +138,4 @@
 
   private:
-	// C-style initializer made up of SingleInit and ListInit nodes to use as a fallback
-	// if an appropriate constructor definition is not found by the resolver
-	Initializer * init;
 };
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Mutator.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -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 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Mutator.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -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/VarExprReplacer.h
===================================================================
--- src/SynTree/VarExprReplacer.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/VarExprReplacer.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -29,5 +29,5 @@
 private:
 	const DeclMap & declMap;
-  bool debug;
+	bool debug;
 public:
 	VarExprReplacer( const DeclMap & declMap, bool debug = false );
@@ -35,4 +35,9 @@
 	// replace variable with new node from decl map
 	virtual void visit( VariableExpr * varExpr );
+
+	static void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false ) {
+		VarExprReplacer replacer( declMap, debug );
+		maybeAccept( node, replacer );
+	}
 };
 
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Visitor.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -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 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/SynTree/Visitor.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -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 );
