diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index ed891831..71ebc972 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -51,18 +51,7 @@ namespace CppSharp.Passes } } else - foreach (var @base in @class.Bases.Where(b => b.IsClass)) - { - var specialization = @base.Class as ClassTemplateSpecialization; - if (specialization != null) - { - specializations.Add(specialization); - foreach (var field in specialization.Fields) - field.Visit(this); - foreach (var method in specialization.Methods) - method.Visit(this); - } - } + CheckBasesForSpecialization(@class); return true; } @@ -191,6 +180,23 @@ namespace CppSharp.Passes CheckLayoutFields(@base); } + private void CheckBasesForSpecialization(Class @class) + { + foreach (var @base in @class.Bases.Where(b => b.IsClass)) + { + var specialization = @base.Class as ClassTemplateSpecialization; + if (specialization != null) + { + specializations.Add(specialization); + foreach (var field in specialization.Fields) + field.Visit(this); + foreach (var method in specialization.Methods) + method.Visit(this); + } + CheckBasesForSpecialization(@base.Class); + } + } + private HashSet specializations = new HashSet(); private HashSet internalSpecializations = new HashSet(); private HashSet templates = new HashSet(); diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index b517c551..fd678808 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -67,6 +67,9 @@ public unsafe class CSharpTests : GeneratorTestFixture { int i = typeMappedWithOperator | 5; } + using (Base @base = new DerivedFromSpecializationOfUnsupportedTemplate()) + { + } #pragma warning restore 0168 #pragma warning restore 0219 diff --git a/tests/CSharp/CSharpTemplates.cpp b/tests/CSharp/CSharpTemplates.cpp index 3342e39e..37845363 100644 --- a/tests/CSharp/CSharpTemplates.cpp +++ b/tests/CSharp/CSharpTemplates.cpp @@ -18,6 +18,14 @@ int T1::getField() const return field; } +DerivedFromSpecializationOfUnsupportedTemplate::DerivedFromSpecializationOfUnsupportedTemplate() +{ +} + +DerivedFromSpecializationOfUnsupportedTemplate::~DerivedFromSpecializationOfUnsupportedTemplate() +{ +} + HasDefaultTemplateArgument::HasDefaultTemplateArgument() { } diff --git a/tests/CSharp/CSharpTemplates.h b/tests/CSharp/CSharpTemplates.h index d734f69d..fa5ec178 100644 --- a/tests/CSharp/CSharpTemplates.h +++ b/tests/CSharp/CSharpTemplates.h @@ -105,7 +105,12 @@ private: }; template -class DLL_API DependentValueFields +class DLL_API Base +{ +}; + +template +class DLL_API DependentValueFields : public Base { public: class Nested @@ -167,6 +172,13 @@ DependentValueFields DependentValueFields::operator+(const DependentValueF return sum; } +class DLL_API DerivedFromSpecializationOfUnsupportedTemplate : public DependentValueFields +{ +public: + DerivedFromSpecializationOfUnsupportedTemplate(); + ~DerivedFromSpecializationOfUnsupportedTemplate(); +}; + template class DLL_API DependentPointerFields { @@ -411,6 +423,7 @@ template class DLL_API IndependentFields; template class DLL_API IndependentFields; template class DLL_API IndependentFields; template class DLL_API IndependentFields; +template class DLL_API Base; template class DLL_API DependentValueFields; template class DLL_API VirtualTemplate; template class DLL_API VirtualTemplate;