Index: src/CodeTools/ResolvProtoDump.cc
===================================================================
--- src/CodeTools/ResolvProtoDump.cc	(revision ee27df2fdf76c37c966500ec374ee044b40e7a0a)
+++ src/CodeTools/ResolvProtoDump.cc	(revision cdc02f28045dea7a293c384abb175ac0c5185dcc)
@@ -204,4 +204,11 @@
 		/// ensures type inst names are uppercase
 		static void ti_name( const std::string& name, std::stringstream& ss ) {
+			// replace built-in wide character types with named types
+			if ( name == "char16_t" || name == "char32_t" || name == "wchar_t" ) {
+				ss << "#" << name;
+				return;
+			}
+
+			// strip leading underscore
 			unsigned i = 0;
 			while ( i < name.size() && name[i] == '_' ) { ++i; }
@@ -210,6 +217,16 @@
 				return;
 			}
-			ss << (char)std::toupper( static_cast<unsigned char>(name[i]) )
-			   << (name.c_str() + i + 1);
+
+			std::string stripped = name.substr(i);
+			// strip trailing "_generic_" from autogen names (avoids some user-generation issues)
+			char generic[] = "_generic_"; size_t n_generic = sizeof(generic) - 1;
+			if ( stripped.size() >= n_generic 
+					&& stripped.substr( stripped.size() - n_generic ) == generic ) {
+				stripped.resize( stripped.size() - n_generic );
+			}
+
+			// uppercase first character
+			ss << (char)std::toupper( static_cast<unsigned char>(stripped[0]) )
+			   << (stripped.c_str() + 1);
 		}
 
@@ -304,5 +321,9 @@
 			}
 
-			// TODO support VarArgsType
+			// TODO support variable args for functions
+			void previsit( VarArgsType* ) {
+				// only include varargs for top level (argument type)
+				if ( depth == 0 ) { ss << "#$varargs"; }
+			}
 
 			// replace 0 and 1 with int
@@ -397,4 +418,11 @@
 			}
 
+			/// Handle already-resolved variables as type constants
+			void previsit( VariableExpr* expr ) {
+				PassVisitor<TypePrinter> tyPrinter{ closed, ss };
+				expr->var->get_type()->accept( tyPrinter );
+				visit_children = false;
+			}
+
 			/// Calls handled as calls
 			void previsit( UntypedExpr* expr ) {
@@ -426,6 +454,8 @@
 			}
 
-			/// Already-resolved calls skipped
-			void previsit( ApplicationExpr* ) {
+			/// Already-resolved calls reduced to their type constant
+			void previsit( ApplicationExpr* expr ) {
+				PassVisitor<TypePrinter> tyPrinter{ closed, ss };
+				expr->result->accept( tyPrinter );
 				visit_children = false;
 			}
@@ -532,5 +562,4 @@
 				for ( Initializer* it : li->initializers ) {
 					build( it, ss );
-					ss << ' ';
 				}
 			}
@@ -539,7 +568,7 @@
 		/// Adds an object initializer to the list of expressions
 		void build( const std::string& name, Initializer* init, std::stringstream& ss ) {
-			ss << "$constructor( ";
+			ss << "$constructor( &";
 			rp_name( name, ss );
-			ss << "() ";
+			ss << ' ';
 			build( init, ss );
 			ss << ')';
@@ -676,4 +705,9 @@
 		}
 
+		void previsit( AsmStmt* ) {
+			// skip asm statements
+			visit_children = false;
+		}
+
 		void previsit( Expression* expr ) {
 			std::stringstream ss;
@@ -686,5 +720,5 @@
 		/// Print non-prelude global declarations for resolv proto
 		void printGlobals() const {
-			std::cout << "#ptr<T> $addr T" << std::endl;  // &?
+			std::cout << "#$ptr<T> $addr T" << std::endl;  // &?
 			int i = (int)BasicType::SignedInt;
 			std::cout << i << " $and " << i << ' ' << i << std::endl;  // ?&&?
Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision ee27df2fdf76c37c966500ec374ee044b40e7a0a)
+++ src/SynTree/Constant.cc	(revision cdc02f28045dea7a293c384abb175ac0c5185dcc)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 14 14:50:00 2017
-// Update Count     : 29
+// Last Modified On : Fri Spt 28 14:49:00 2018
+// Update Count     : 30
 //
 
@@ -19,4 +19,5 @@
 
 #include "Constant.h"
+#include "Expression.h" // for ConstantExpr
 #include "Type.h"    // for BasicType, Type, Type::Qualifiers, PointerType
 
@@ -48,4 +49,14 @@
 Constant Constant::from_double( double d ) {
 	return Constant( new BasicType( Type::Qualifiers(), BasicType::Double ), std::to_string( d ), d );
+}
+
+Constant Constant::from_string( std::string const & str ) {
+	return Constant(
+		new ArrayType(
+			noQualifiers,
+			new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
+			new ConstantExpr( Constant::from_int( str.size() + 1 /* \0 */ )),
+			false, false ),
+		std::string("\"") + str + "\"", (unsigned long long int)0 );
 }
 
Index: src/SynTree/Constant.h
===================================================================
--- src/SynTree/Constant.h	(revision ee27df2fdf76c37c966500ec374ee044b40e7a0a)
+++ src/SynTree/Constant.h	(revision cdc02f28045dea7a293c384abb175ac0c5185dcc)
@@ -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:46 2017
-// Update Count     : 17
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Spt 28 14:48:00 2018
+// Update Count     : 18
 //
 
@@ -51,4 +51,6 @@
 	/// generates a floating point constant of the given double
 	static Constant from_double( double d );
+	/// generates an array of chars constant of the given string
+	static Constant from_string( std::string const & s );
 
 	/// generates a null pointer value for the given type. void * if omitted.
