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
var castToClass = method.OriginalNamespace as Class; var castToClass = method.OriginalNamespace as Class;
if (qualifiedPointee.TryGetClass(out castFromClass)) if (qualifiedPointee.TryGetClass(out castFromClass))
{ {
if (castToClass == null) if (castToClass == null || castToClass.IsAbstract)
return false; return false;
if (castFromClass == castToClass) if (ConvertsBetweenDerivedTypes(castToClass, castFromClass))
return false; return false;
} }
if (castToClass != null && castToClass.IsAbstract) if (castToClass != null && castToClass.IsAbstract)
@ -59,5 +59,24 @@ namespace CppSharp.Passes
((Class) method.Namespace).Methods.Add(conversionOperator); ((Class) method.Namespace).Methods.Add(conversionOperator);
return true; 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
var isNoParams = foo.IsNoParams; var isNoParams = foo.IsNoParams;
foo.SetNoParams(); foo.SetNoParams();
} }
using (var qux = new Qux())
{
new Bar(qux).Dispose();
}
} }
[Test] [Test]

8
tests/CSharpTemp/CSharpTemp.cpp

@ -83,6 +83,10 @@ Qux::Qux(Foo foo)
} }
Qux::Qux(Bar bar)
{
}
int Qux::farAwayFunc() const int Qux::farAwayFunc() const
{ {
return 20; return 20;
@ -102,6 +106,10 @@ void Qux::setInterface(Qux *qux)
{ {
} }
Bar::Bar(Qux qux)
{
}
int Bar::method() int Bar::method()
{ {
return 2; return 2;

3
tests/CSharpTemp/CSharpTemp.h

@ -31,12 +31,14 @@ private:
int priv; int priv;
}; };
class Bar;
class DLL_API Qux class DLL_API Qux
{ {
public: public:
Qux(); Qux();
Qux(Foo foo); Qux(Foo foo);
Qux(Bar bar);
int farAwayFunc() const; int farAwayFunc() const;
int array[3]; int array[3];
void obsolete(); void obsolete();
@ -53,6 +55,7 @@ public:
Item2 Item2
}; };
Bar(); Bar();
Bar(Qux qux);
int method(); int method();
const Foo& operator[](int i) const; const Foo& operator[](int i) const;
Foo& operator[](int i); Foo& operator[](int i);

Loading…
Cancel
Save