diff --git a/src/Generator/Passes/GetterSetterToPropertyPass.cs b/src/Generator/Passes/GetterSetterToPropertyPass.cs index c51fc5fa..b20396e8 100644 --- a/src/Generator/Passes/GetterSetterToPropertyPass.cs +++ b/src/Generator/Passes/GetterSetterToPropertyPass.cs @@ -152,10 +152,6 @@ namespace CppSharp.Passes if (getter.IsOverride || (setter != null && setter.IsOverride)) { var baseVirtualProperty = type.GetBaseProperty(property, getTopmost: true); - if (baseVirtualProperty == null && type.GetBaseMethod(getter, getTopmost: true).IsGenerated) - throw new Exception(string.Format( - "Property {0} has a base property null but its getter has a generated base method.", - getter.QualifiedOriginalName)); if (baseVirtualProperty != null && !baseVirtualProperty.IsVirtual) { // the only way the above can happen is if we are generating properties in abstract implementations @@ -166,7 +162,7 @@ namespace CppSharp.Passes "Base of property {0} is not virtual while the getter is.", getter.QualifiedOriginalName)); } - if (baseVirtualProperty != null && baseVirtualProperty.SetMethod == null) + if (baseVirtualProperty == null || baseVirtualProperty.SetMethod == null) setter = null; } property.GetMethod = getter; diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index 5b24ce94..63c6d287 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -667,6 +667,17 @@ public unsafe class CSharpTests : GeneratorTestFixture } } + [Test] + public void TestOverriddenSetterOnly() + { + using (var hasGetterAndOverriddenSetter = new HasGetterAndOverriddenSetter()) + { + const int value = 5; + hasGetterAndOverriddenSetter.SetBaseSetter(value); + Assert.That(hasGetterAndOverriddenSetter.BaseSetter, Is.EqualTo(value)); + } + } + private class OverrideVirtualWithString : HasVirtualTakesReturnsProblematicTypes { public override string VirtualTakesAndReturnsString(string c) diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index bb13baf8..4137135f 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1266,3 +1266,33 @@ int ImplementsAbstractsFromPrimaryAndSecondary::abstractReturnsFieldInSecondaryB { return field + 2; } + +HasBaseSetter::HasBaseSetter() +{ +} + +HasBaseSetter::~HasBaseSetter() +{ +} + +void HasBaseSetter::setBaseSetter(int value) +{ +} + +HasGetterAndOverriddenSetter::HasGetterAndOverriddenSetter() +{ +} + +HasGetterAndOverriddenSetter::~HasGetterAndOverriddenSetter() +{ +} + +int HasGetterAndOverriddenSetter::baseSetter() +{ + return field; +} + +void HasGetterAndOverriddenSetter::setBaseSetter(int value) +{ + field = value; +} diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index ad815c8b..71576f44 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1123,3 +1123,22 @@ public: private: int field; }; + +class DLL_API HasBaseSetter +{ +public: + HasBaseSetter(); + ~HasBaseSetter(); + virtual void setBaseSetter(int value); +}; + +class DLL_API HasGetterAndOverriddenSetter : public HasBaseSetter +{ +public: + HasGetterAndOverriddenSetter(); + ~HasGetterAndOverriddenSetter(); + void setBaseSetter(int value); + int baseSetter(); +protected: + int field; +};