diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index 680dd42adc..80614c1548 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -155,22 +155,41 @@ private static void TryMoveExternalSpecializations(Class template) { continue; } - var modules = (from arg in specialization.Arguments - where arg.Type.Type != null - && ASTUtils.IsTypeExternal( - template.TranslationUnit.Module, arg.Type.Type) - let module = arg.Type.Type.GetModule() - where module != null - select module).ToList().TopologicalSort(m => m.Dependencies); - if (modules.Count > 0) + Module module = GetExternalModule(specialization); + if (module != null) { - var module = modules.Last(); module.ExternalClassTemplateSpecializations.Add(specialization); template.Specializations.RemoveAt(i); } } } + private static Module GetExternalModule(ClassTemplateSpecialization specialization) + { + Module currentModule = specialization.TemplatedDecl.TemplatedClass.TranslationUnit.Module; + List modules = new List(); + foreach (TemplateArgument arg in specialization.Arguments.Where(arg => arg.Type.Type != null)) + { + if (ASTUtils.IsTypeExternal(currentModule, arg.Type.Type)) + { + Module module = arg.Type.Type.GetModule(); + if (module != null) + { + modules.Add(module); + } + } + if (arg.Type.Type.TryGetDeclaration(out ClassTemplateSpecialization nestedSpecialization)) + { + Module module = GetExternalModule(nestedSpecialization); + if (module != null) + { + modules.Add(module); + } + } + } + return modules.TopologicalSort(m => m.Dependencies).LastOrDefault(); + } + private void CheckForInternalSpecialization(Declaration container, AST.Type type) { ASTUtils.CheckTypeForSpecialization(type, container, diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h index 6d0ea80140..613fcf23d7 100644 --- a/tests/NamespacesDerived/NamespacesDerived.h +++ b/tests/NamespacesDerived/NamespacesDerived.h @@ -66,6 +66,7 @@ class DLL_API Derived2 : public Base3 private: TemplateClass t; TemplateClass d; + TemplateClass> nestedSpecialization; }; class DLL_API HasVirtualInDependency : public HasVirtualInCore