From 76ea3158dfa43bb287812443055123212350cc40 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 4 Aug 2015 20:39:57 +0300 Subject: [PATCH] Prevented conversion operators from getting ref params. Signed-off-by: Dimitar Dobrev --- src/Generator/Driver.cs | 2 +- .../Passes/MarshalPrimitivePointersAsRefTypePass.cs | 8 +++++++- tests/CSharpTemp/CSharpTemp.Tests.cs | 3 ++- tests/CSharpTemp/CSharpTemp.cpp | 2 +- tests/CSharpTemp/CSharpTemp.h | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 2e41ea5f..35ced15b 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -242,7 +242,6 @@ namespace CppSharp TranslationUnitPasses.AddPass(new SortDeclarationsPass()); TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); - TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass()); if (Options.IsCSharpGenerator && Options.GenerateInlines) TranslationUnitPasses.AddPass(new GenerateInlinesCodePass()); @@ -258,6 +257,7 @@ namespace CppSharp if (Options.GenerateConversionOperators) TranslationUnitPasses.AddPass(new ConstructorToConversionOperatorPass()); + TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass()); TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions()); TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass()); TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance()); diff --git a/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs b/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs index f0e80d91..7f2228e6 100644 --- a/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs +++ b/src/Generator/Passes/MarshalPrimitivePointersAsRefTypePass.cs @@ -8,10 +8,16 @@ namespace CppSharp.Passes { public override bool VisitFunctionDecl(Function function) { + if (!base.VisitFunctionDecl(function) || + function.OperatorKind == CXXOperatorKind.Conversion || + function.OperatorKind == CXXOperatorKind.ExplicitConversion) + return false; + foreach (var param in function.Parameters.Where( p => !p.IsOut && p.IsPrimitiveParameterConvertibleToRef())) param.Usage = ParameterUsage.InOut; - return base.VisitFunctionDecl(function); + + return true; } } } \ No newline at end of file diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index 481f61f4..6aedbbaf 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -349,7 +349,8 @@ public class CSharpTempTests : GeneratorTestFixture [Test] public unsafe void TestMultiOverLoadPtrToRef() { - var obj = new MultiOverloadPtrToRef(); + var r = 0; + var obj = new MultiOverloadPtrToRef(ref r); var p = obj.ReturnPrimTypePtr(); Assert.AreEqual(0, p[0]); Assert.AreEqual(0, p[1]); diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index adb8ec63..2854c26a 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -701,7 +701,7 @@ void MultiOverloadPtrToRef::funcPrimitivePtrToRefWithMultiOverload(int* pOne, ch { } -MultiOverloadPtrToRef::MultiOverloadPtrToRef() +MultiOverloadPtrToRef::MultiOverloadPtrToRef(int* param) { arr = new int[3]{0}; } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index eb0d0889..726544e0 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -622,11 +622,11 @@ class DLL_API MultiOverloadPtrToRef { int * arr; public: + MultiOverloadPtrToRef(int* param); void funcPrimitivePtrToRef(int *pOne, char* pTwo, float* pThree, bool* pFour = 0); void funcPrimitivePtrToRefWithDefVal(int* pOne, char* pTwo, Foo* pThree, int* pFour = 0); virtual void funcPrimitivePtrToRefWithMultiOverload(int* pOne, char* pTwo, Foo* pThree, int* pFour = 0, long* pFive = 0); - MultiOverloadPtrToRef(); int* ReturnPrimTypePtr(); void TakePrimTypePtr(int* ptr); };