From fbd76adcb9ad4318aa7f36112467d056ce5cfee0 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 22 Dec 2017 16:05:13 +0200 Subject: [PATCH] Fixed the generated C# when a base class is an external specialisation. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/TrimSpecializationsPass.cs | 6 +++++- tests/NamespacesBase/NamespacesBase.h | 7 +++++++ tests/NamespacesDerived/NamespacesDerived.cpp | 8 ++++++++ tests/NamespacesDerived/NamespacesDerived.cs | 1 + tests/NamespacesDerived/NamespacesDerived.h | 7 +++++++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index 3b542907..a7f46c39 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -190,7 +190,11 @@ namespace CppSharp.Passes { var specialization = @base.Class as ClassTemplateSpecialization; if (specialization != null) - AddSpecialization(specialization); + { + if (!ASTUtils.CheckTypeForSpecialization(@base.Type, @class, + AddSpecialization, Context.TypeMaps)) + CheckForInternalSpecialization(@class, @base.Type); + } CheckBasesForSpecialization(@base.Class); } } diff --git a/tests/NamespacesBase/NamespacesBase.h b/tests/NamespacesBase/NamespacesBase.h index 3c495812..927f9a39 100644 --- a/tests/NamespacesBase/NamespacesBase.h +++ b/tests/NamespacesBase/NamespacesBase.h @@ -59,6 +59,13 @@ class TemplateClass T t; }; +template +class TemplateWithIndependentFields +{ +public: + void useDependentPointer(const T* t); +}; + class DLL_API HasVirtualInCore { public: diff --git a/tests/NamespacesDerived/NamespacesDerived.cpp b/tests/NamespacesDerived/NamespacesDerived.cpp index 06cc55b9..e5ad74e8 100644 --- a/tests/NamespacesDerived/NamespacesDerived.cpp +++ b/tests/NamespacesDerived/NamespacesDerived.cpp @@ -62,6 +62,14 @@ Abstract* Derived2::getAbstract() return 0; } +DerivedFromExternalSpecialization::DerivedFromExternalSpecialization() +{ +} + +DerivedFromExternalSpecialization::~DerivedFromExternalSpecialization() +{ +} + HasVirtualInDependency::HasVirtualInDependency() { } diff --git a/tests/NamespacesDerived/NamespacesDerived.cs b/tests/NamespacesDerived/NamespacesDerived.cs index e87d4ecc..4c1d5924 100644 --- a/tests/NamespacesDerived/NamespacesDerived.cs +++ b/tests/NamespacesDerived/NamespacesDerived.cs @@ -16,6 +16,7 @@ namespace CppSharp.Tests { base.Setup(driver); driver.Options.GenerateDefaultValuesForArguments = true; + driver.Options.GenerateClassTemplates = true; driver.Options.Modules[1].IncludeDirs.Add(GetTestsDirectory("NamespacesDerived")); var @base = "NamespacesBase"; diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h index e5e5addb..2d70943e 100644 --- a/tests/NamespacesDerived/NamespacesDerived.h +++ b/tests/NamespacesDerived/NamespacesDerived.h @@ -71,6 +71,13 @@ public: int callManagedOverride(); }; +class DLL_API DerivedFromExternalSpecialization : public TemplateWithIndependentFields +{ +public: + DerivedFromExternalSpecialization(); + ~DerivedFromExternalSpecialization(); +}; + class DLL_API DerivedFromSecondaryBaseInDependency : public Derived, public SecondaryBase { public: