Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 8e0147a3fa40da836a0a286511428f42a89e10eb)
+++ src/SymTab/Mangler.cc	(revision 0fe4e6265f263a0fedaac815f2ed782fe74dabdd)
@@ -32,11 +32,17 @@
 namespace SymTab {
 	std::string Mangler::mangleType( Type * ty ) {
-		Mangler mangler( false, true );
+		Mangler mangler( false, true, true );
 		maybeAccept( ty, mangler );
 		return mangler.get_mangleName();
 	}
 
-	Mangler::Mangler( bool mangleOverridable, bool typeMode )
-		: nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ) {}
+	std::string Mangler::mangleConcrete( Type* ty ) {
+		Mangler mangler( false, false, false );
+		maybeAccept( ty, mangler );
+		return mangler.get_mangleName();
+	}
+
+	Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams )
+		: nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ), mangleGenericParams( mangleGenericParams ) {}
 
 	Mangler::Mangler( const Mangler &rhs ) : mangleName() {
@@ -166,37 +172,25 @@
 
 		mangleName << ( refType->get_name().length() + prefix.length() ) << prefix << refType->get_name();
-	}
-
-	void Mangler::mangleGenericRef( ReferenceToType * refType, std::string prefix ) {
-		printQualifiers( refType );
-
-		std::ostringstream oldName( mangleName.str() );
-		mangleName.clear();
-
-		mangleName << prefix << refType->get_name();
-
-		std::list< Expression* >& params = refType->get_parameters();
-		if ( ! params.empty() ) {
-			mangleName << "_";
-			for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
-				TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
-				assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
-				maybeAccept( paramType->get_type(), *this );
+
+		if ( mangleGenericParams ) {
+			std::list< Expression* >& params = refType->get_parameters();
+			if ( ! params.empty() ) {
+				mangleName << "_";
+				for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) {
+					TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
+					assertf(paramType, "Aggregate parameters should be type expressions: %s", toString(*param).c_str());
+					maybeAccept( paramType->get_type(), *this );
+				}
+				mangleName << "_";
 			}
-			mangleName << "_";
 		}
-
-		oldName << mangleName.str().length() << mangleName.str();
-		mangleName.str( oldName.str() );
 	}
 
 	void Mangler::visit( StructInstType * aggregateUseType ) {
-		if ( typeMode ) mangleGenericRef( aggregateUseType, "s" );
-		else mangleRef( aggregateUseType, "s" );
+		mangleRef( aggregateUseType, "s" );
 	}
 
 	void Mangler::visit( UnionInstType * aggregateUseType ) {
-		if ( typeMode ) mangleGenericRef( aggregateUseType, "u" );
-		else mangleRef( aggregateUseType, "u" );
+		mangleRef( aggregateUseType, "u" );
 	}
 
@@ -285,5 +279,5 @@
 				varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() );
 				for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) {
-					Mangler sub_mangler( mangleOverridable, typeMode );
+					Mangler sub_mangler( mangleOverridable, typeMode, mangleGenericParams );
 					sub_mangler.nextVarNum = nextVarNum;
 					sub_mangler.isTopLevel = false;
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision 8e0147a3fa40da836a0a286511428f42a89e10eb)
+++ src/SymTab/Mangler.h	(revision 0fe4e6265f263a0fedaac815f2ed782fe74dabdd)
@@ -30,7 +30,10 @@
 		/// Mangle syntax tree object; primary interface to clients
 		template< typename SynTreeClass >
-	    static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true, bool typeMode = false );
+	    static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true, bool typeMode = false, bool mangleGenericParams = true );
 		/// Mangle a type name; secondary interface
 		static std::string mangleType( Type* ty );
+		/// Mangle ignoring generic type parameters
+		static std::string mangleConcrete( Type* ty );
+
 
 		virtual void visit( ObjectDecl *declaration );
@@ -62,11 +65,11 @@
 		bool mangleOverridable;         ///< Specially mangle overridable built-in methods
 		bool typeMode;                  ///< Produce a unique mangled name for a type
+		bool mangleGenericParams;       ///< Include generic parameters in name mangling if true
 
-		Mangler( bool mangleOverridable, bool typeMode );
+		Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams );
 		Mangler( const Mangler & );
 
 		void mangleDecl( DeclarationWithType *declaration );
 		void mangleRef( ReferenceToType *refType, std::string prefix );
-		void mangleGenericRef( ReferenceToType *refType, std::string prefix );
 
 		void printQualifiers( Type *type );
@@ -74,6 +77,6 @@
 
 	template< typename SynTreeClass >
-	std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable, bool typeMode ) {
-		Mangler mangler( mangleOverridable, typeMode );
+	std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable, bool typeMode, bool mangleGenericParams ) {
+		Mangler mangler( mangleOverridable, typeMode, mangleGenericParams );
 		maybeAccept( decl, mangler );
 		return mangler.get_mangleName();
