Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision c6747a1976ae3b05e7405ec67eca0b4196c994af)
+++ src/InitTweak/GenInit.cc	(revision e35f30aa1a6d9c1e9ec668432b5671719a8b5882)
@@ -214,5 +214,5 @@
 		}
 		// a type is managed if it appears in the map of known managed types, or if it contains any polymorphism (is a type variable or generic type containing a type variable)
-		return managedTypes.find( SymTab::Mangler::mangle( type ) ) != managedTypes.end() || GenPoly::isPolyType( type );
+		return managedTypes.find( SymTab::Mangler::mangleConcrete( type ) ) != managedTypes.end() || GenPoly::isPolyType( type );
 	}
 
@@ -232,5 +232,5 @@
 			Type * type = InitTweak::getPointerBase( params.front()->get_type() );
 			assert( type );
-			managedTypes.insert( SymTab::Mangler::mangle( type ) );
+			managedTypes.insert( SymTab::Mangler::mangleConcrete( type ) );
 		}
 	}
@@ -242,6 +242,8 @@
 			if ( ObjectDecl * field = dynamic_cast< ObjectDecl * >( member ) ) {
 				if ( isManaged( field ) ) {
+					// generic parameters should not play a role in determining whether a generic type is constructed - construct all generic types, so that
+					// polymorphic constructors make generic types managed types
 					StructInstType inst( Type::Qualifiers(), aggregateDecl );
-					managedTypes.insert( SymTab::Mangler::mangle( &inst ) );
+					managedTypes.insert( SymTab::Mangler::mangleConcrete( &inst ) );
 					break;
 				}
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision c6747a1976ae3b05e7405ec67eca0b4196c994af)
+++ src/SymTab/Mangler.cc	(revision e35f30aa1a6d9c1e9ec668432b5671719a8b5882)
@@ -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 c6747a1976ae3b05e7405ec67eca0b4196c994af)
+++ src/SymTab/Mangler.h	(revision e35f30aa1a6d9c1e9ec668432b5671719a8b5882)
@@ -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();
