diff --git a/src/Generator/Passes/ConstructorToConversionOperatorPass.cs b/src/Generator/Passes/ConstructorToConversionOperatorPass.cs index de32c3e9..5239b726 100644 --- a/src/Generator/Passes/ConstructorToConversionOperatorPass.cs +++ b/src/Generator/Passes/ConstructorToConversionOperatorPass.cs @@ -28,9 +28,9 @@ namespace CppSharp.Passes var castToClass = method.OriginalNamespace as Class; if (qualifiedPointee.TryGetClass(out castFromClass)) { - if (castToClass == null) + if (castToClass == null || castToClass.IsAbstract) return false; - if (castFromClass == castToClass) + if (ConvertsBetweenDerivedTypes(castToClass, castFromClass)) return false; } if (castToClass != null && castToClass.IsAbstract) @@ -59,5 +59,24 @@ namespace CppSharp.Passes ((Class) method.Namespace).Methods.Add(conversionOperator); return true; } + + private static bool ConvertsBetweenDerivedTypes(Class castToClass, Class castFromClass) + { + var @base = castToClass; + while (@base != null) + { + if (@base == castFromClass) + return true; + @base = @base.BaseClass; + } + @base = castFromClass; + while (@base != null) + { + if (@base == castToClass) + return true; + @base = @base.BaseClass; + } + return false; + } } } diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index 65c72f82..2c6af951 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -27,6 +27,10 @@ public class CSharpTempTests : GeneratorTestFixture var isNoParams = foo.IsNoParams; foo.SetNoParams(); } + using (var qux = new Qux()) + { + new Bar(qux).Dispose(); + } } [Test] diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 68e8024b..85ab4c2f 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -83,6 +83,10 @@ Qux::Qux(Foo foo) } +Qux::Qux(Bar bar) +{ +} + int Qux::farAwayFunc() const { return 20; @@ -102,6 +106,10 @@ void Qux::setInterface(Qux *qux) { } +Bar::Bar(Qux qux) +{ +} + int Bar::method() { return 2; diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 468226db..179af8aa 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -31,12 +31,14 @@ private: int priv; }; +class Bar; class DLL_API Qux { public: Qux(); Qux(Foo foo); + Qux(Bar bar); int farAwayFunc() const; int array[3]; void obsolete(); @@ -53,6 +55,7 @@ public: Item2 }; Bar(); + Bar(Qux qux); int method(); const Foo& operator[](int i) const; Foo& operator[](int i);