Browse Source

Fixed the binding of a copy ctor when a move ctor exists too.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/862/head
Dimitar Dobrev 9 years ago
parent
commit
c740a34dfa
  1. 3
      src/Generator/AST/Utils.cs
  2. 1
      src/Generator/Driver.cs
  3. 2
      src/Generator/Generators/CSharp/CSharpSources.cs
  4. 2
      src/Generator/Passes/CheckAmbiguousFunctions.cs
  5. 36
      src/Generator/Passes/IgnoreMoveConstructorsPass.cs
  6. 34
      tests/Common/Common.Tests.cs
  7. 24
      tests/Common/Common.cpp
  8. 13
      tests/Common/Common.h

3
src/Generator/AST/Utils.cs

@ -31,9 +31,6 @@ namespace CppSharp.AST
if (@class != null && @class.IsValueType && isEmptyCtor) if (@class != null && @class.IsValueType && isEmptyCtor)
return true; return true;
if (method.IsMoveConstructor)
return true;
if (method.IsDestructor) if (method.IsDestructor)
return true; return true;

1
src/Generator/Driver.cs

@ -302,6 +302,7 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new GenerateAnonymousDelegatesPass()); TranslationUnitPasses.AddPass(new GenerateAnonymousDelegatesPass());
TranslationUnitPasses.AddPass(new ConstructorToConversionOperatorPass()); TranslationUnitPasses.AddPass(new ConstructorToConversionOperatorPass());
TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass()); TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass());
TranslationUnitPasses.AddPass(new IgnoreMoveConstructorsPass());
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions()); TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass()); TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass());
TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance()); TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance());

2
src/Generator/Generators/CSharp/CSharpSources.cs

@ -494,7 +494,7 @@ namespace CppSharp.Generators.CSharp
{ {
foreach (var ctor in @class.Constructors) foreach (var ctor in @class.Constructors)
{ {
if (@class.IsStatic || ctor.IsMoveConstructor) if (@class.IsStatic)
continue; continue;
if (!ctor.IsGenerated) if (!ctor.IsGenerated)

2
src/Generator/Passes/CheckAmbiguousFunctions.cs

@ -33,7 +33,7 @@ namespace CppSharp.Passes
if (!VisitDeclaration(function)) if (!VisitDeclaration(function))
return false; return false;
if (function.IsAmbiguous) if (function.IsAmbiguous || !function.IsGenerated)
return false; return false;
var overloads = function.Namespace.GetOverloads(function); var overloads = function.Namespace.GetOverloads(function);

36
src/Generator/Passes/IgnoreMoveConstructorsPass.cs

@ -0,0 +1,36 @@
using CppSharp.AST;
using CppSharp.Passes;
namespace CppSharp.Passes
{
public class IgnoreMoveConstructorsPass : TranslationUnitPass
{
public IgnoreMoveConstructorsPass()
{
VisitOptions.VisitClassBases = false;
VisitOptions.VisitClassFields = false;
VisitOptions.VisitClassProperties = false;
VisitOptions.VisitEventParameters = false;
VisitOptions.VisitFunctionParameters = false;
VisitOptions.VisitFunctionReturnType = false;
VisitOptions.VisitNamespaceEnums = false;
VisitOptions.VisitNamespaceEvents = false;
VisitOptions.VisitNamespaceVariables = false;
VisitOptions.VisitTemplateArguments = false;
}
public override bool VisitMethodDecl(Method method)
{
if (!base.VisitMethodDecl(method))
return false;
if (method.IsMoveConstructor)
{
method.ExplicitlyIgnore();
return true;
}
return false;
}
}
}

34
tests/Common/Common.Tests.cs

@ -355,15 +355,31 @@ public class CommonTests : GeneratorTestFixture
[Test] [Test]
public void TestCopyConstructor() public void TestCopyConstructor()
{ {
Foo foo = new Foo { A = 5, B = 5.5f }; using (Foo foo = new Foo { A = 5, B = 5.5f })
var copyFoo = new Foo(foo); {
Assert.That(foo.A, Is.EqualTo(copyFoo.A)); using (var copyFoo = new Foo(foo))
Assert.That(foo.B, Is.EqualTo(copyFoo.B)); {
Assert.That(foo.A, Is.EqualTo(copyFoo.A));
var testCopyConstructorRef = new TestCopyConstructorRef { A = 10, B = 5 }; Assert.That(foo.B, Is.EqualTo(copyFoo.B));
var copyBar = new TestCopyConstructorRef(testCopyConstructorRef); }
Assert.That(testCopyConstructorRef.A, Is.EqualTo(copyBar.A)); }
Assert.That(testCopyConstructorRef.B, Is.EqualTo(copyBar.B));
using (var testCopyConstructorRef = new TestCopyConstructorRef { A = 10, B = 5 })
{
using (var copyBar = new TestCopyConstructorRef(testCopyConstructorRef))
{
Assert.That(testCopyConstructorRef.A, Is.EqualTo(copyBar.A));
Assert.That(testCopyConstructorRef.B, Is.EqualTo(copyBar.B));
}
}
using (var original = new HasCopyAndMoveConstructor(5))
{
using (var copy = new HasCopyAndMoveConstructor(original))
{
Assert.That(copy.Field, Is.EqualTo(original.Field));
}
}
} }
[Test] [Test]

24
tests/Common/Common.cpp

@ -683,3 +683,27 @@ TestStaticClass& TestStaticClass::operator=(const TestStaticClass& oth)
{ {
return *this; return *this;
} }
HasCopyAndMoveConstructor::HasCopyAndMoveConstructor(int value)
{
field = value;
}
HasCopyAndMoveConstructor::HasCopyAndMoveConstructor(const HasCopyAndMoveConstructor &other)
{
field = other.field;
}
HasCopyAndMoveConstructor::HasCopyAndMoveConstructor(HasCopyAndMoveConstructor&& other)
{
field = other.field;
}
HasCopyAndMoveConstructor::~HasCopyAndMoveConstructor()
{
}
int HasCopyAndMoveConstructor::getField()
{
return field;
}

13
tests/Common/Common.h

@ -763,7 +763,6 @@ public:
class DLL_API HasStdString class DLL_API HasStdString
{ {
// test if these are ignored with the C# back-end
public: public:
std::string testStdString(std::string s); std::string testStdString(std::string s);
std::string s; std::string s;
@ -1223,3 +1222,15 @@ enum EmptyEnum { };
enum __enum_with_underscores { lOWER_BEFORE_CAPITAL, CAPITALS_More, underscore_at_end_, usesDigits1_0 }; enum __enum_with_underscores { lOWER_BEFORE_CAPITAL, CAPITALS_More, underscore_at_end_, usesDigits1_0 };
void DLL_API sMallFollowedByCapital(); void DLL_API sMallFollowedByCapital();
class DLL_API HasCopyAndMoveConstructor
{
public:
HasCopyAndMoveConstructor(int value);
HasCopyAndMoveConstructor(const HasCopyAndMoveConstructor& other);
HasCopyAndMoveConstructor(HasCopyAndMoveConstructor&& other);
~HasCopyAndMoveConstructor();
int getField();
private:
int field;
};

Loading…
Cancel
Save