Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision bdd07556747632c6cfc8d469c9e4644b6593e9ad)
+++ src/CodeGen/CodeGenerator.cc	(revision 262f085f5bcbf8161e794c370badc1a66ccb3991)
@@ -772,6 +772,9 @@
 	void CodeGenerator::visit( ExprStmt * exprStmt ) {
 		assert( exprStmt );
-		// cast the top-level expression to void to reduce gcc warnings.
-		Expression * expr = new CastExpr( exprStmt->get_expr() );
+		Expression * expr = exprStmt->get_expr();
+		if ( genC ) {
+			// cast the top-level expression to void to reduce gcc warnings.
+			expr = new CastExpr( expr );
+		}
 		expr->accept( *this );
 		output << ";";
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision bdd07556747632c6cfc8d469c9e4644b6593e9ad)
+++ src/CodeGen/Generate.cc	(revision 262f085f5bcbf8161e794c370badc1a66ccb3991)
@@ -22,5 +22,9 @@
 #include "SynTree/Declaration.h"
 #include "CodeGenerator.h"
-#include "Tuples/Tuples.h"
+#include "GenType.h"
+#include "SynTree/SynTree.h"
+#include "SynTree/Type.h"
+#include "SynTree/BaseSyntaxNode.h"
+// #include "Tuples/Tuples.h"
 
 using namespace std;
@@ -39,4 +43,14 @@
 		} // for
 	}
+
+	void generate( BaseSyntaxNode * node, std::ostream & os ) {
+		if ( Type * type = dynamic_cast< Type * >( node ) ) {
+			os << CodeGen::genPrettyType( type, "" );
+		} else {
+			CodeGen::CodeGenerator cgv( os, true, false );
+			node->accept( cgv );
+		}
+		os << std::endl;
+	}
 } // namespace CodeGen
 
Index: src/CodeGen/Generate.h
===================================================================
--- src/CodeGen/Generate.h	(revision bdd07556747632c6cfc8d469c9e4644b6593e9ad)
+++ src/CodeGen/Generate.h	(revision 262f085f5bcbf8161e794c370badc1a66ccb3991)
@@ -25,4 +25,7 @@
 	/// Generates code. doIntrinsics determines if intrinsic functions are printed, pretty formats output nicely (e.g., uses unmangled names, etc.), generateC is true when the output must consist only of C code (allows some assertions, etc.)
 	void generate( std::list< Declaration* > translationUnit, std::ostream &os, bool doIntrinsics, bool pretty, bool generateC = false );
+
+	/// Generate code for a single node -- helpful for debugging in gdb
+	void generate( BaseSyntaxNode * node, std::ostream & os );
 } // namespace CodeGen
 
Index: src/SynTree/BaseSyntaxNode.h
===================================================================
--- src/SynTree/BaseSyntaxNode.h	(revision bdd07556747632c6cfc8d469c9e4644b6593e9ad)
+++ src/SynTree/BaseSyntaxNode.h	(revision 262f085f5bcbf8161e794c370badc1a66ccb3991)
@@ -18,8 +18,11 @@
 
 #include "Common/utility.h"
+#include "Visitor.h"
 
 class BaseSyntaxNode {
   public:
 	CodeLocation location;
+
+	virtual void accept( Visitor & v ) = 0; // temporary -- needs to be here so that BaseSyntaxNode is polymorphic and can be dynamic_cast
 };
 
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision bdd07556747632c6cfc8d469c9e4644b6593e9ad)
+++ src/SynTree/SynTree.h	(revision 262f085f5bcbf8161e794c370badc1a66ccb3991)
@@ -21,4 +21,6 @@
 #include <map>
 #include <iostream>
+
+class BaseSyntaxNode;
 
 class Declaration;
