diff --git a/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs index f6a4d090..097df0c0 100644 --- a/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs +++ b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs @@ -11,10 +11,15 @@ namespace CppSharp.Passes Method rootBaseMethod = ((Class) method.Namespace).GetBaseMethod(method); for (int i = 0; i < method.Parameters.Count; i++) { - if (rootBaseMethod.Parameters[i].DefaultArgument != null) + var rootBaseParameter = rootBaseMethod.Parameters[i]; + var parameter = method.Parameters[i]; + if (rootBaseParameter.DefaultArgument == null) { - method.Parameters[i].DefaultArgument = - rootBaseMethod.Parameters[i].DefaultArgument.Clone(); + parameter.DefaultArgument = null; + } + else + { + parameter.DefaultArgument = rootBaseParameter.DefaultArgument.Clone(); } } } diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index a65d6539..89009f89 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -44,6 +44,11 @@ public unsafe class CSharpTests : GeneratorTestFixture var isNoParams = foo.IsNoParams; foo.SetNoParams(); foo.Width = 5; + using (var hasSecondaryBaseWithAbstractWithDefaultArg = new HasSecondaryBaseWithAbstractWithDefaultArg()) + { + hasSecondaryBaseWithAbstractWithDefaultArg.Abstract(); + hasSecondaryBaseWithAbstractWithDefaultArg.AbstractWithNoDefaultArg(foo); + } } using (var hasOverride = new HasOverrideOfHasPropertyWithDerivedType()) hasOverride.CauseRenamingError(); @@ -58,10 +63,6 @@ public unsafe class CSharpTests : GeneratorTestFixture { int i = typeMappedWithOperator | 5; } - using (var hasSecondaryBaseWithAbstractWithDefaultArg = new HasSecondaryBaseWithAbstractWithDefaultArg()) - { - hasSecondaryBaseWithAbstractWithDefaultArg.Abstract(); - } } [Test] diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 86f53daf..23ce434f 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1142,6 +1142,14 @@ TestString::~TestString() { } +PrimaryBaseWithAbstractWithDefaultArg::PrimaryBaseWithAbstractWithDefaultArg() +{ +} + +PrimaryBaseWithAbstractWithDefaultArg::~PrimaryBaseWithAbstractWithDefaultArg() +{ +} + SecondaryBaseWithAbstractWithDefaultArg::SecondaryBaseWithAbstractWithDefaultArg() { } @@ -1161,3 +1169,7 @@ HasSecondaryBaseWithAbstractWithDefaultArg::~HasSecondaryBaseWithAbstractWithDef void HasSecondaryBaseWithAbstractWithDefaultArg::abstract(const Foo& foo) { } + +void HasSecondaryBaseWithAbstractWithDefaultArg::abstractWithNoDefaultArg(const Foo& foo) +{ +} diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 6d0f6cbe..7eecffe4 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1031,6 +1031,14 @@ void decltypeFunctionPointer(); using funcPtr = decltype(&decltypeFunctionPointer); void usesDecltypeFunctionPointer(funcPtr func); +class DLL_API PrimaryBaseWithAbstractWithDefaultArg +{ +public: + PrimaryBaseWithAbstractWithDefaultArg(); + ~PrimaryBaseWithAbstractWithDefaultArg(); + virtual void abstractWithNoDefaultArg(const Foo& foo) = 0; +}; + class DLL_API SecondaryBaseWithAbstractWithDefaultArg { public: @@ -1039,10 +1047,11 @@ public: virtual void abstract(const Foo& foo = Foo()) = 0; }; -class DLL_API HasSecondaryBaseWithAbstractWithDefaultArg : public Foo, public SecondaryBaseWithAbstractWithDefaultArg +class DLL_API HasSecondaryBaseWithAbstractWithDefaultArg : public PrimaryBaseWithAbstractWithDefaultArg, public SecondaryBaseWithAbstractWithDefaultArg { public: HasSecondaryBaseWithAbstractWithDefaultArg(); ~HasSecondaryBaseWithAbstractWithDefaultArg(); virtual void abstract(const Foo& foo = Foo()); + virtual void abstractWithNoDefaultArg(const Foo& foo = Foo()); };