Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision ddae80952adda8c0439bcb45ce5c85a4e6001acb)
+++ 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;
 				}
