Browse Source

Fixed the pass for conversion operators not to create such for ctors taking a base or derived type.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/518/merge
Dimitar Dobrev 10 years ago
parent
commit
52abb8fd97
  1. 23
      src/Generator/Passes/ConstructorToConversionOperatorPass.cs
  2. 4
      tests/CSharpTemp/CSharpTemp.Tests.cs
  3. 8
      tests/CSharpTemp/CSharpTemp.cpp
  4. 3
      tests/CSharpTemp/CSharpTemp.h

23
src/Generator/Passes/ConstructorToConversionOperatorPass.cs

@ -28,9 +28,9 @@ namespace CppSharp.Passes @@ -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 @@ -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;
}
}
}

4
tests/CSharpTemp/CSharpTemp.Tests.cs

@ -27,6 +27,10 @@ public class CSharpTempTests : GeneratorTestFixture @@ -27,6 +27,10 @@ public class CSharpTempTests : GeneratorTestFixture
var isNoParams = foo.IsNoParams;
foo.SetNoParams();
}
using (var qux = new Qux())
{
new Bar(qux).Dispose();
}
}
[Test]

8
tests/CSharpTemp/CSharpTemp.cpp

@ -83,6 +83,10 @@ Qux::Qux(Foo foo) @@ -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) @@ -102,6 +106,10 @@ void Qux::setInterface(Qux *qux)
{
}
Bar::Bar(Qux qux)
{
}
int Bar::method()
{
return 2;

3
tests/CSharpTemp/CSharpTemp.h

@ -31,12 +31,14 @@ private: @@ -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: @@ -53,6 +55,7 @@ public:
Item2
};
Bar();
Bar(Qux qux);
int method();
const Foo& operator[](int i) const;
Foo& operator[](int i);

Loading…
Cancel
Save