Browse Source

Generate valid C# when passing a const ref to char

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1159/merge
Dimitar Dobrev 6 years ago
parent
commit
f810ca63b2
  1. 3
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 9
      tests/CSharp/CSharp.Tests.cs
  3. 5
      tests/CSharp/CSharp.cpp
  4. 1
      tests/CSharp/CSharp.h

3
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -557,8 +557,7 @@ namespace CppSharp.Generators.CSharp @@ -557,8 +557,7 @@ namespace CppSharp.Generators.CSharp
if (Context.Context.Options.MarshalCharAsManagedChar &&
primitive == PrimitiveType.Char)
{
Context.Return.Write($"({typePrinter.PrintNative(pointer)}) ");
Context.Return.Write(param.Name);
Context.Return.Write($"({typePrinter.PrintNative(pointer)}) &{param.Name}");
return true;
}

9
tests/CSharp/CSharp.Tests.cs

@ -94,7 +94,6 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -94,7 +94,6 @@ public unsafe class CSharpTests : GeneratorTestFixture
{
}
CSharp.CSharp.ReturnCharPointer();
int value = 5;
IntPtr intPtr = CSharp.CSharp.RValueReferenceToPointer((void**) &value);
Assert.That((int) intPtr, Is.EqualTo(value));
@ -103,6 +102,14 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -103,6 +102,14 @@ public unsafe class CSharpTests : GeneratorTestFixture
#pragma warning restore 0219
}
[Test]
public void TestReturnCharPointer()
{
Assert.That(new IntPtr(CSharp.CSharp.ReturnCharPointer()), Is.EqualTo(IntPtr.Zero));
const char z = 'z';
Assert.That(*CSharp.CSharp.TakeConstCharRef(z), Is.EqualTo(z));
}
[Test]
public void TestIndexer()
{

5
tests/CSharp/CSharp.cpp

@ -1566,6 +1566,11 @@ char* returnCharPointer() @@ -1566,6 +1566,11 @@ char* returnCharPointer()
return 0;
}
char* takeConstCharRef(const char& c)
{
return const_cast<char*>(&c);
}
const char*& takeConstCharStarRef(const char*& c)
{
return c;

1
tests/CSharp/CSharp.h

@ -1312,6 +1312,7 @@ public: @@ -1312,6 +1312,7 @@ public:
DLL_API void va_listFunction(va_list v);
DLL_API char* returnCharPointer();
DLL_API char* takeConstCharRef(const char& c);
DLL_API const char*& takeConstCharStarRef(const char*& c);
DLL_API const void*& rValueReferenceToPointer(void*&& v);

Loading…
Cancel
Save