Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/ApplicationExpr.cc	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -44,5 +44,5 @@
 }
 
-ApplicationExpr::ApplicationExpr( Expression *funcExpr ) : function( funcExpr ) {
+ApplicationExpr::ApplicationExpr( Expression *funcExpr, const std::list< Expression * > & argList ) : function( funcExpr ), args( argList ) {
 	PointerType *pointer = safe_dynamic_cast< PointerType* >( funcExpr->get_result() );
 	FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() );
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/Expression.cc	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 30 16:41:13 2017
-// Update Count     : 52
+// Last Modified On : Tue Jul 25 14:15:47 2017
+// Update Count     : 54
 //
 
@@ -298,4 +298,29 @@
 	if ( result->isVoid() ) {
 		os << "nothing";
+	} else {
+		result->print( os, indent+2 );
+	} // if
+	os << std::endl;
+	Expression::print( os, indent );
+}
+
+VirtualCastExpr::VirtualCastExpr( Expression *arg_, Type *toType ) : Expression(), arg(arg_) {
+	set_result(toType);
+}
+
+VirtualCastExpr::VirtualCastExpr( const VirtualCastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
+}
+
+VirtualCastExpr::~VirtualCastExpr() {
+	delete arg;
+}
+
+void VirtualCastExpr::print( std::ostream &os, int indent ) const {
+	os << "Virtual Cast of:" << std::endl << std::string( indent+2, ' ' );
+	arg->print(os, indent+2);
+	os << std::endl << std::string( indent, ' ' ) << "to:" << std::endl;
+	os << std::string( indent+2, ' ' );
+	if ( ! result ) {
+		os << "unknown";
 	} else {
 		result->print( os, indent+2 );
@@ -503,5 +528,5 @@
 }
 
-AsmExpr::AsmExpr( const AsmExpr & other ) : inout( maybeClone( other.inout ) ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
+AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( maybeClone( other.inout ) ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
 
 
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/Expression.h	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:53:16 2017
-// Update Count     : 42
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jul 24 16:27:00 2017
+// Update Count     : 43
 //
 
@@ -79,5 +79,5 @@
 class ApplicationExpr : public Expression {
   public:
-	ApplicationExpr( Expression * function );
+	ApplicationExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >() );
 	ApplicationExpr( const ApplicationExpr & other );
 	virtual ~ApplicationExpr();
@@ -194,7 +194,25 @@
 
 	Expression * get_arg() const { return arg; }
-	void set_arg(Expression * newValue ) { arg = newValue; }
+	void set_arg( Expression * newValue ) { arg = newValue; }
 
 	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, int indent = 0 ) const;
+  private:
+	Expression * arg;
+};
+
+/// VirtualCastExpr repersents a virtual dynamic cast, e.g. (virtual exception)e
+class VirtualCastExpr : public Expression {
+  public:
+	VirtualCastExpr( Expression * arg, Type * toType );
+	VirtualCastExpr( const VirtualCastExpr & other );
+	virtual ~VirtualCastExpr();
+
+	Expression * get_arg() const { return arg; }
+	void set_arg( Expression * newValue ) { arg = newValue; }
+
+	virtual VirtualCastExpr * clone() const { return new VirtualCastExpr( * this ); }
 	virtual void accept( Visitor & v ) { v.visit( this ); }
 	virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/Mutator.cc	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Jun 22 13:43:00 2017
-// Update Count     : 24
+// Last Modified On : Mon Jul 24 16:32:00 2017
+// Update Count     : 25
 //
 
@@ -235,4 +235,11 @@
 }
 
+Expression *Mutator::mutate( VirtualCastExpr *castExpr ) {
+	castExpr->set_env( maybeMutate( castExpr->get_env(), *this ) );
+	castExpr->set_result( maybeMutate( castExpr->get_result(), *this ) );
+	castExpr->set_arg( maybeMutate( castExpr->get_arg(), *this ) );
+	return castExpr;
+}
+
 Expression *Mutator::mutate( UntypedMemberExpr *memberExpr ) {
 	memberExpr->set_env( maybeMutate( memberExpr->get_env(), *this ) );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/Mutator.h	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:51:30 2017
-// Update Count     : 15
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jul 24 16:31:00 2017
+// Update Count     : 16
 //
 #include <cassert>
@@ -59,4 +59,5 @@
 	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 );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/SynTree.h	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:51:46 2017
-// Update Count     : 10
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jul 24 16:54:00 2017
+// Update Count     : 11
 //
 
@@ -66,4 +66,5 @@
 class LabelAddressExpr;
 class CastExpr;
+class VirtualCastExpr;
 class MemberExpr;
 class UntypedMemberExpr;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/Visitor.cc	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Jun 22 13:41:00 2017
-// Update Count     : 26
+// Last Modified On : Mon Jul 24 16:30:00 2017
+// Update Count     : 27
 //
 
@@ -192,4 +192,9 @@
 }
 
+void Visitor::visit( VirtualCastExpr *castExpr ) {
+	maybeAccept( castExpr->get_result(), *this );
+	maybeAccept( castExpr->get_arg(), *this );
+}
+
 void Visitor::visit( UntypedMemberExpr *memberExpr ) {
 	maybeAccept( memberExpr->get_result(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 6b0b624129f6017f7706b516a24a52e382e3a334)
+++ src/SynTree/Visitor.h	(revision 7bd1bb544ce1bc6e33ef4d25b9399f1a7094a812)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:54:04 2017
-// Update Count     : 12
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jul 24 16:28:00 2017
+// Update Count     : 13
 //
 
@@ -60,4 +60,5 @@
 	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 );
