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
if (Context.Context.Options.MarshalCharAsManagedChar && if (Context.Context.Options.MarshalCharAsManagedChar &&
primitive == PrimitiveType.Char) primitive == PrimitiveType.Char)
{ {
Context.Return.Write($"({typePrinter.PrintNative(pointer)}) "); Context.Return.Write($"({typePrinter.PrintNative(pointer)}) &{param.Name}");
Context.Return.Write(param.Name);
return true; return true;
} }

9
tests/CSharp/CSharp.Tests.cs

@ -94,7 +94,6 @@ public unsafe class CSharpTests : GeneratorTestFixture
{ {
} }
CSharp.CSharp.ReturnCharPointer();
int value = 5; int value = 5;
IntPtr intPtr = CSharp.CSharp.RValueReferenceToPointer((void**) &value); IntPtr intPtr = CSharp.CSharp.RValueReferenceToPointer((void**) &value);
Assert.That((int) intPtr, Is.EqualTo(value)); Assert.That((int) intPtr, Is.EqualTo(value));
@ -103,6 +102,14 @@ public unsafe class CSharpTests : GeneratorTestFixture
#pragma warning restore 0219 #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] [Test]
public void TestIndexer() public void TestIndexer()
{ {

5
tests/CSharp/CSharp.cpp

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

1
tests/CSharp/CSharp.h

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

Loading…
Cancel
Save