Index: src/SynTree/CompoundStmt.cc
===================================================================
--- src/SynTree/CompoundStmt.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/CompoundStmt.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -23,5 +23,5 @@
 #include "Statement.h"                // for CompoundStmt, Statement, DeclStmt
 #include "SynTree/Label.h"            // for Label
-#include "SynTree/VarExprReplacer.h"  // for VarExprReplacer, VarExprReplace...
+#include "SynTree/DeclReplacer.h"     // for DeclReplacer
 
 using std::string;
@@ -49,5 +49,5 @@
 	// recursively execute this routine. There may be more efficient ways of doing
 	// this.
-	VarExprReplacer::DeclMap declMap;
+	DeclReplacer::DeclMap declMap;
 	std::list< Statement * >::const_iterator origit = other.kids.begin();
 	for ( Statement * s : kids ) {
@@ -64,5 +64,5 @@
 	}
 	if ( ! declMap.empty() ) {
-		VarExprReplacer::replace( this, declMap );
+		DeclReplacer::replace( this, declMap );
 	}
 }
Index: src/SynTree/DeclReplacer.cc
===================================================================
--- src/SynTree/DeclReplacer.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
+++ src/SynTree/DeclReplacer.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -0,0 +1,82 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// VarExprReplacer.h --
+//
+// Author           : Rob Schluntz
+// Created On       : Wed Jan 13 16:29:30 2016
+// Last Modified By : Rob Schluntz
+// Last Modified On : Fri May 13 11:27:52 2016
+// Update Count     : 5
+//
+
+#include <iostream>       // for operator<<, basic_ostream, ostream, basic_o...
+
+#include "Common/PassVisitor.h"
+#include "Declaration.h"  // for operator<<, DeclarationWithType
+#include "Expression.h"   // for VariableExpr
+#include "DeclReplacer.h"
+
+namespace DeclReplacer {
+	namespace {
+		/// Visitor that replaces the declarations that VariableExprs refer to, according to the supplied mapping
+		struct DeclReplacer {
+		private:
+			const DeclMap & declMap;
+			const TypeMap & typeMap;
+			bool debug;
+		public:
+			DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
+
+			// replace variable with new node from decl map
+			void previsit( VariableExpr * varExpr );
+
+			// replace type inst with new node from type map
+			void previsit( TypeInstType * inst );
+		};
+	}
+
+	void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
+		PassVisitor<DeclReplacer> replacer( declMap, typeMap, debug );
+		maybeAccept( node, replacer );
+	}
+
+	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
+		TypeMap typeMap;
+		replace( node, declMap, typeMap, debug );
+	}
+
+	void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
+		DeclMap declMap;
+		replace( node, declMap, typeMap, debug );
+	}
+
+	namespace {
+		DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ) {}
+
+		// replace variable with new node from decl map
+		void DeclReplacer::previsit( VariableExpr * varExpr ) {
+			// xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
+			if ( declMap.count( varExpr->var ) ) {
+				auto replacement = declMap.at( varExpr->var );
+				if ( debug ) {
+					std::cerr << "replacing variable reference: " << (void*)varExpr->var << " " << varExpr->var << " with " << (void*)replacement << " " << replacement << std::endl;
+				}
+				varExpr->var = replacement;
+			}
+		}
+
+		void DeclReplacer::previsit( TypeInstType * inst ) {
+			if ( typeMap.count( inst->baseType ) ) {
+				auto replacement = typeMap.at( inst->baseType );
+				if ( debug ) {
+					std::cerr << "replacing type reference: " << (void*)inst->baseType << " " << inst->baseType << " with " << (void*)replacement << " " << replacement << std::endl;
+				}
+				inst->baseType = replacement;
+			}
+		}
+	}
+} // namespace VarExprReplacer
Index: src/SynTree/DeclReplacer.h
===================================================================
--- src/SynTree/DeclReplacer.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
+++ src/SynTree/DeclReplacer.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -0,0 +1,38 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// VarExprReplacer.h --
+//
+// Author           : Rob Schluntz
+// Created On       : Wed Jan 13 16:29:30 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Jul 22 09:53:41 2017
+// Update Count     : 6
+//
+
+#pragma once
+
+#include <map>                // for map, map<>::value_compare
+
+#include "SynTree/Visitor.h"  // for Visitor
+
+class DeclarationWithType;
+class VariableExpr;
+
+namespace DeclReplacer {
+	typedef std::map< DeclarationWithType *, DeclarationWithType * > DeclMap;
+	typedef std::map< TypeDecl *, TypeDecl * > TypeMap;
+
+	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false );
+	void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug = false );
+	void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Declaration.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -74,4 +74,27 @@
 
 
+StaticAssertDecl::StaticAssertDecl( Expression * condition, ConstantExpr * message ) : Declaration( "", Type::StorageClasses(), LinkageSpec::C ), condition( condition ), message( message )  {
+}
+
+StaticAssertDecl::StaticAssertDecl( const StaticAssertDecl & other ) : Declaration( other ), condition( maybeClone( other.condition ) ), message( maybeClone( other.message ) )  {
+}
+
+StaticAssertDecl::~StaticAssertDecl() {
+	delete condition;
+	delete message;
+}
+
+void StaticAssertDecl::print( std::ostream &os, Indenter indent ) const {
+	os << "Static Assert with condition: ";
+	condition->print( os, indent+1 );
+	os << std::endl << indent << "and message: ";
+	message->print( os, indent+1 );
+os << std::endl;
+}
+
+void StaticAssertDecl::printShort( std::ostream &os, Indenter indent ) const {
+	print( os, indent );
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Declaration.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -357,4 +357,20 @@
 };
 
+class StaticAssertDecl : public Declaration {
+public:
+	Expression * condition;
+	ConstantExpr * message;   // string literal
+
+	StaticAssertDecl( Expression * condition, ConstantExpr * message );
+	StaticAssertDecl( const StaticAssertDecl & other );
+	virtual ~StaticAssertDecl();
+
+	virtual StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
+	virtual void accept( Visitor &v ) override { v.visit( this ); }
+	virtual StaticAssertDecl * acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+};
+
 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data );
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Expression.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -238,13 +238,13 @@
 }
 
-CastExpr::CastExpr( Expression *arg_, Type *toType ) : Expression(), arg(arg_) {
+CastExpr::CastExpr( Expression *arg, Type *toType, bool isGenerated ) : Expression(), arg(arg), isGenerated( isGenerated ) {
 	set_result(toType);
 }
 
-CastExpr::CastExpr( Expression *arg_ ) : Expression(), arg(arg_) {
+CastExpr::CastExpr( Expression *arg, bool isGenerated ) : Expression(), arg(arg), isGenerated( isGenerated ) {
 	set_result( new VoidType( Type::Qualifiers() ) );
 }
 
-CastExpr::CastExpr( const CastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
+CastExpr::CastExpr( const CastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ), isGenerated( other.isGenerated ) {
 }
 
@@ -259,4 +259,33 @@
 		result->print( os, indent+1 );
 	} // if
+	Expression::print( os, indent );
+}
+
+KeywordCastExpr::KeywordCastExpr( Expression *arg, Target target ) : Expression(), arg(arg), target( target ) {
+}
+
+KeywordCastExpr::KeywordCastExpr( const KeywordCastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ), target( other.target ) {
+}
+
+KeywordCastExpr::~KeywordCastExpr() {
+	delete arg;
+}
+
+const std::string & KeywordCastExpr::targetString() const {
+	static const std::string targetStrs[] = {
+		"coroutine", "thread", "monitor"
+	};
+	static_assert(
+		(sizeof(targetStrs) / sizeof(targetStrs[0])) == ((unsigned long)NUMBER_OF_TARGETS),
+		"Each KeywordCastExpr::Target should have a corresponding string representation"
+	);
+	return targetStrs[(unsigned long)target];
+}
+
+void KeywordCastExpr::print( std::ostream &os, Indenter indent ) const {
+	os << "Keyword Cast of:" << std::endl << indent+1;
+	arg->print(os, indent+1);
+	os << std::endl << indent << "... to: ";
+	os << targetString();
 	Expression::print( os, indent );
 }
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Expression.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -184,7 +184,9 @@
   public:
 	Expression * arg;
-
-	CastExpr( Expression * arg );
-	CastExpr( Expression * arg, Type * toType );
+	bool isGenerated = true; // whether this cast appeared in the source program
+
+	CastExpr( Expression * arg, bool isGenerated = true );
+	CastExpr( Expression * arg, Type * toType, bool isGenerated = true );
+	CastExpr( Expression * arg, void * ) = delete; // prevent accidentally passing pointers for isGenerated in the first constructor
 	CastExpr( const CastExpr & other );
 
@@ -193,4 +195,24 @@
 
 	virtual CastExpr * clone() const { return new CastExpr( * this ); }
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const;
+};
+
+/// KeywordCastExpr represents a cast to 'keyword types', e.g. (thread &)t
+class KeywordCastExpr : public Expression {
+public:
+	Expression * arg;
+	enum Target {
+		Coroutine, Thread, Monitor, NUMBER_OF_TARGETS
+	} target;
+
+	KeywordCastExpr( Expression * arg, Target target );
+	KeywordCastExpr( const KeywordCastExpr & other );
+	virtual ~KeywordCastExpr();
+
+	const std::string & targetString() const;
+
+	virtual KeywordCastExpr * clone() const { return new KeywordCastExpr( * this ); }
 	virtual void accept( Visitor & v ) { v.visit( this ); }
 	virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/FunctionDecl.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -26,5 +26,5 @@
 #include "Statement.h"           // for CompoundStmt
 #include "Type.h"                // for Type, FunctionType, Type::FuncSpecif...
-#include "VarExprReplacer.h"
+#include "DeclReplacer.h"
 
 extern bool translation_unit_nomain;
@@ -41,5 +41,5 @@
 		: Parent( other ), type( maybeClone( other.type ) ), statements( maybeClone( other.statements ) ) {
 
-	VarExprReplacer::DeclMap declMap;
+	DeclReplacer::DeclMap declMap;
 	for ( auto p : group_iterate( other.type->parameters, type->parameters ) ) {
 		declMap[ std::get<0>(p) ] = std::get<1>(p);
@@ -49,5 +49,5 @@
 	}
 	if ( ! declMap.empty() ) {
-		VarExprReplacer::replace( this, declMap );
+		DeclReplacer::replace( this, declMap );
 	}
 	cloneAll( other.withExprs, withExprs );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Mutator.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -34,4 +34,5 @@
 	virtual Declaration * mutate( TypedefDecl * typeDecl ) = 0;
 	virtual AsmDecl * mutate( AsmDecl * asmDecl ) = 0;
+	virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) = 0;
 
 	virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) = 0;
@@ -58,7 +59,8 @@
 	virtual Expression * mutate( UntypedExpr * untypedExpr ) = 0;
 	virtual Expression * mutate( NameExpr * nameExpr ) = 0;
-	virtual Expression * mutate( AddressExpr * castExpr ) = 0;
+	virtual Expression * mutate( AddressExpr * addrExpr ) = 0;
 	virtual Expression * mutate( LabelAddressExpr * labAddressExpr ) = 0;
 	virtual Expression * mutate( CastExpr * castExpr ) = 0;
+	virtual Expression * mutate( KeywordCastExpr * castExpr ) = 0;
 	virtual Expression * mutate( VirtualCastExpr * castExpr ) = 0;
 	virtual Expression * mutate( UntypedMemberExpr * memberExpr ) = 0;
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Statement.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -34,7 +34,7 @@
 Statement::Statement( const std::list<Label> & labels ) : labels( labels ) {}
 
-void Statement::print( std::ostream & os, Indenter ) const {
+void Statement::print( std::ostream & os, Indenter indent ) const {
 	if ( ! labels.empty() ) {
-		os << "Labels: {";
+		os << indent << "... Labels: {";
 		for ( const Label & l : labels ) {
 			os << l << ",";
@@ -188,7 +188,7 @@
 
 void CaseStmt::print( std::ostream &os, Indenter indent ) const {
-	if ( isDefault() ) os << "Default ";
+	if ( isDefault() ) os << indent << "Default ";
 	else {
-		os << "Case ";
+		os << indent << "Case ";
 		condition->print( os, indent );
 	} // if
@@ -196,4 +196,5 @@
 
 	for ( Statement * stmt : stmts ) {
+		os << indent+1;
 		stmt->print( os, indent+1 );
 	}
@@ -391,6 +392,7 @@
 }
 
-void NullStmt::print( std::ostream &os, Indenter ) const {
+void NullStmt::print( std::ostream &os, Indenter indent ) const {
 	os << "Null Statement" << endl;
+	Statement::print( os, indent );
 }
 
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Statement.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Sep  3 20:46:46 2017
-// Update Count     : 77
+// Last Modified On : Thu Mar  8 14:53:02 2018
+// Update Count     : 78
 //
 
@@ -246,5 +246,5 @@
 class BranchStmt : public Statement {
   public:
-	enum Type { Goto = 0, Break, Continue };
+	enum Type { Goto = 0, Break, Continue, FallThrough, FallThroughDefault };
 
 	// originalTarget kept for error messages.
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/SynTree.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -38,4 +38,5 @@
 class TypedefDecl;
 class AsmDecl;
+class StaticAssertDecl;
 
 class Statement;
@@ -68,4 +69,5 @@
 class LabelAddressExpr;
 class CastExpr;
+class KeywordCastExpr;
 class VirtualCastExpr;
 class MemberExpr;
Index: src/SynTree/TypeSubstitution.cc
===================================================================
--- src/SynTree/TypeSubstitution.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/TypeSubstitution.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -132,11 +132,18 @@
 		return inst;
 	} else {
-///	    std::cerr << "found " << inst->get_name() << ", replacing with ";
-///	    i->second->print( std::cerr );
-///	    std::cerr << std::endl;
+		// cut off infinite loop for the case where a type is bound to itself.
+		// Note: this does not prevent cycles in the general case, so it may be necessary to do something more sophisticated here.
+		// TODO: investigate preventing type variables from being bound to themselves in the first place.
+		if ( TypeInstType * replacement = dynamic_cast< TypeInstType * >( i->second ) ) {
+			if ( inst->name == replacement->name ) {
+				return inst;
+			}
+		}
+		// std::cerr << "found " << inst->name << ", replacing with " << i->second << std::endl;
 		subCount++;
 		Type * newtype = i->second->clone();
 		newtype->get_qualifiers() |= inst->get_qualifiers();
-		return newtype;
+		// Note: need to recursively apply substitution to the new type because normalize does not substitute bound vars, but bound vars must be substituted when not in freeOnly mode.
+		return newtype->acceptMutator( *visitor );
 	} // if
 }
Index: src/SynTree/TypeSubstitution.h
===================================================================
--- src/SynTree/TypeSubstitution.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/TypeSubstitution.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -125,5 +125,5 @@
 
 // definitition must happen after PassVisitor is included so that WithGuards can be used
-struct TypeSubstitution::Substituter : public WithGuards {
+struct TypeSubstitution::Substituter : public WithGuards, public WithVisitorRef<Substituter> {
 		Substituter( TypeSubstitution & sub, bool freeOnly ) : sub( sub ), freeOnly( freeOnly ) {}
 
Index: src/SynTree/VarExprReplacer.cc
===================================================================
--- src/SynTree/VarExprReplacer.cc	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ 	(revision )
@@ -1,64 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// VarExprReplacer.h --
-//
-// Author           : Rob Schluntz
-// Created On       : Wed Jan 13 16:29:30 2016
-// Last Modified By : Rob Schluntz
-// Last Modified On : Fri May 13 11:27:52 2016
-// Update Count     : 5
-//
-
-#include <iostream>       // for operator<<, basic_ostream, ostream, basic_o...
-
-#include "Common/PassVisitor.h"
-#include "Declaration.h"  // for operator<<, DeclarationWithType
-#include "Expression.h"   // for VariableExpr
-#include "VarExprReplacer.h"
-
-namespace VarExprReplacer {
-	namespace {
-		/// Visitor that replaces the declarations that VariableExprs refer to, according to the supplied mapping
-		struct VarExprReplacer {
-		private:
-			const DeclMap & declMap;
-			bool debug;
-		public:
-			VarExprReplacer( const DeclMap & declMap, bool debug = false );
-
-			// replace variable with new node from decl map
-			void previsit( VariableExpr * varExpr );
-		};
-	}
-
-	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
-		PassVisitor<VarExprReplacer> replacer( declMap, debug );
-		maybeAccept( node, replacer );
-	}
-
-	namespace {
-		VarExprReplacer::VarExprReplacer( const DeclMap & declMap, bool debug ) : declMap( declMap ), debug( debug ) {}
-
-		// replace variable with new node from decl map
-		void VarExprReplacer::previsit( VariableExpr * varExpr ) {
-			// xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
-			if ( declMap.count( varExpr->var ) ) {
-				if ( debug ) {
-					std::cerr << "replacing variable reference: " << (void*)varExpr->var << " " << varExpr->var << " with " << (void*)declMap.at( varExpr->var ) << " " << declMap.at( varExpr->var ) << std::endl;
-				}
-				varExpr->var = declMap.at( varExpr->var );
-			}
-		}
-	}
-} // namespace VarExprReplacer
-
-
-
-
-
-
-
Index: src/SynTree/VarExprReplacer.h
===================================================================
--- src/SynTree/VarExprReplacer.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ 	(revision )
@@ -1,35 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// VarExprReplacer.h --
-//
-// Author           : Rob Schluntz
-// Created On       : Wed Jan 13 16:29:30 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:53:41 2017
-// Update Count     : 6
-//
-
-#pragma once
-
-#include <map>                // for map, map<>::value_compare
-
-#include "SynTree/Visitor.h"  // for Visitor
-
-class DeclarationWithType;
-class VariableExpr;
-
-namespace VarExprReplacer {
-	typedef std::map< DeclarationWithType *, DeclarationWithType * > DeclMap;
-
-	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false );
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/Visitor.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -36,4 +36,5 @@
 	virtual void visit( TypedefDecl * typeDecl ) = 0;
 	virtual void visit( AsmDecl * asmDecl ) = 0;
+	virtual void visit( StaticAssertDecl * assertDecl ) = 0;
 
 	virtual void visit( CompoundStmt * compoundStmt ) = 0;
@@ -61,4 +62,5 @@
 	virtual void visit( NameExpr * nameExpr ) = 0;
 	virtual void visit( CastExpr * castExpr ) = 0;
+	virtual void visit( KeywordCastExpr * castExpr ) = 0;
 	virtual void visit( VirtualCastExpr * castExpr ) = 0;
 	virtual void visit( AddressExpr * addressExpr ) = 0;
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 2efe4b8f0141e181a04fcc0495d13a8c7a0a06b9)
+++ src/SynTree/module.mk	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -49,4 +49,4 @@
        SynTree/Attribute.cc \
        SynTree/BaseSyntaxNode.cc \
-       SynTree/VarExprReplacer.cc
+       SynTree/DeclReplacer.cc
 
