Skip to content

Commit 3b0eb18

Browse files
committed
Generate valid C# for nested external specializations
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent aab63d0 commit 3b0eb18

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

src/Generator/Passes/TrimSpecializationsPass.cs

+28-9
Original file line numberDiff line numberDiff line change
@@ -155,22 +155,41 @@ private static void TryMoveExternalSpecializations(Class template)
155155
{
156156
continue;
157157
}
158-
var modules = (from arg in specialization.Arguments
159-
where arg.Type.Type != null
160-
&& ASTUtils.IsTypeExternal(
161-
template.TranslationUnit.Module, arg.Type.Type)
162-
let module = arg.Type.Type.GetModule()
163-
where module != null
164-
select module).ToList().TopologicalSort(m => m.Dependencies);
165-
if (modules.Count > 0)
158+
Module module = GetExternalModule(specialization);
159+
if (module != null)
166160
{
167-
var module = modules.Last();
168161
module.ExternalClassTemplateSpecializations.Add(specialization);
169162
template.Specializations.RemoveAt(i);
170163
}
171164
}
172165
}
173166

167+
private static Module GetExternalModule(ClassTemplateSpecialization specialization)
168+
{
169+
Module currentModule = specialization.TemplatedDecl.TemplatedClass.TranslationUnit.Module;
170+
List<Module> modules = new List<Module>();
171+
foreach (TemplateArgument arg in specialization.Arguments.Where(arg => arg.Type.Type != null))
172+
{
173+
if (ASTUtils.IsTypeExternal(currentModule, arg.Type.Type))
174+
{
175+
Module module = arg.Type.Type.GetModule();
176+
if (module != null)
177+
{
178+
modules.Add(module);
179+
}
180+
}
181+
if (arg.Type.Type.TryGetDeclaration(out ClassTemplateSpecialization nestedSpecialization))
182+
{
183+
Module module = GetExternalModule(nestedSpecialization);
184+
if (module != null)
185+
{
186+
modules.Add(module);
187+
}
188+
}
189+
}
190+
return modules.TopologicalSort(m => m.Dependencies).LastOrDefault();
191+
}
192+
174193
private void CheckForInternalSpecialization(Declaration container, AST.Type type)
175194
{
176195
ASTUtils.CheckTypeForSpecialization(type, container,

tests/NamespacesDerived/NamespacesDerived.h

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class DLL_API Derived2 : public Base3
6666
private:
6767
TemplateClass<int> t;
6868
TemplateClass<Derived> d;
69+
TemplateClass<TemplateWithIndependentFields<Derived>> nestedSpecialization;
6970
};
7071

7172
class DLL_API HasVirtualInDependency : public HasVirtualInCore

0 commit comments

Comments
 (0)