From 6245f9e1054195fd9e08a665f8b013e68fa7f666 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sat, 17 Sep 2016 11:30:10 +0300 Subject: [PATCH] Fixed the generated C# when an abstract function in a secondary base has a non-primitive default argument. Signed-off-by: Dimitar Dobrev --- .../Passes/MultipleInheritancePass.cs | 3 ++- tests/CSharp/CSharp.Tests.cs | 4 ++++ tests/CSharp/CSharp.cpp | 20 +++++++++++++++++++ tests/CSharp/CSharp.h | 16 +++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Generator/Passes/MultipleInheritancePass.cs b/src/Generator/Passes/MultipleInheritancePass.cs index 2d88e1de..c379e3d3 100644 --- a/src/Generator/Passes/MultipleInheritancePass.cs +++ b/src/Generator/Passes/MultipleInheritancePass.cs @@ -165,7 +165,8 @@ namespace CppSharp.Passes foreach (var method in @interface.Methods) { if (@class.Methods.Any(m => m.OriginalName == method.OriginalName && - m.Parameters.SequenceEqual(method.Parameters.Where(p => !p.Ignore), + m.Parameters.Where(p => !p.Ignore).SequenceEqual( + method.Parameters.Where(p => !p.Ignore), ParameterTypeComparer.Instance))) continue; var impl = new Method(method) diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index c9da11b4..a65d6539 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -58,6 +58,10 @@ 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 ea55a589..86f53daf 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1141,3 +1141,23 @@ TestString::TestString() : unicodeConst(L"ქართული ენა"), uni TestString::~TestString() { } + +SecondaryBaseWithAbstractWithDefaultArg::SecondaryBaseWithAbstractWithDefaultArg() +{ +} + +SecondaryBaseWithAbstractWithDefaultArg::~SecondaryBaseWithAbstractWithDefaultArg() +{ +} + +HasSecondaryBaseWithAbstractWithDefaultArg::HasSecondaryBaseWithAbstractWithDefaultArg() +{ +} + +HasSecondaryBaseWithAbstractWithDefaultArg::~HasSecondaryBaseWithAbstractWithDefaultArg() +{ +} + +void HasSecondaryBaseWithAbstractWithDefaultArg::abstract(const Foo& foo) +{ +} diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 4be59043..6d0f6cbe 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1030,3 +1030,19 @@ void decltypeFunctionPointer(); using funcPtr = decltype(&decltypeFunctionPointer); void usesDecltypeFunctionPointer(funcPtr func); + +class DLL_API SecondaryBaseWithAbstractWithDefaultArg +{ +public: + SecondaryBaseWithAbstractWithDefaultArg(); + ~SecondaryBaseWithAbstractWithDefaultArg(); + virtual void abstract(const Foo& foo = Foo()) = 0; +}; + +class DLL_API HasSecondaryBaseWithAbstractWithDefaultArg : public Foo, public SecondaryBaseWithAbstractWithDefaultArg +{ +public: + HasSecondaryBaseWithAbstractWithDefaultArg(); + ~HasSecondaryBaseWithAbstractWithDefaultArg(); + virtual void abstract(const Foo& foo = Foo()); +};