From 1dbc76f134fea41065b29c0a79a6675b1c66f7c1 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 17 Oct 2014 16:42:00 +0300 Subject: [PATCH] Fixed a bug when a char parameter is assigned a default value of 0. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/HandleDefaultParamValuesPass.cs | 11 +++++++++++ tests/CSharpTemp/CSharpTemp.Tests.cs | 1 + tests/CSharpTemp/CSharpTemp.cpp | 4 ++++ tests/CSharpTemp/CSharpTemp.h | 1 + 4 files changed, 17 insertions(+) diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 1d741c45..3489c2d5 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -44,6 +44,8 @@ namespace CppSharp.Passes continue; CheckForULongValue(parameter, desugared); + + CheckForDefaultEmptyChar(parameter, desugared); } GenerateOverloads(function, overloadIndices); @@ -146,6 +148,15 @@ namespace CppSharp.Passes parameter.DefaultArgument.String = value.ToString(CultureInfo.InvariantCulture); } + private void CheckForDefaultEmptyChar(Parameter parameter, Type desugared) + { + if (parameter.DefaultArgument.String == "0" && Driver.Options.MarshalCharAsManagedChar && + desugared.IsPrimitiveType(PrimitiveType.Char)) + { + parameter.DefaultArgument.String = "'\\0'"; + } + } + private static void GenerateOverloads(Function function, List overloadIndices) { foreach (var overloadIndex in overloadIndices) diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index 788f4f48..78b98e51 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -131,6 +131,7 @@ public class CSharpTempTests : GeneratorTestFixture { var methodsWithDefaultValues = new MethodsWithDefaultValues(); methodsWithDefaultValues.DefaultChar(); + methodsWithDefaultValues.DefaultEmptyChar(); methodsWithDefaultValues.DefaultPointer(); methodsWithDefaultValues.DefaultRefTypeAfterOthers(); methodsWithDefaultValues.DefaultRefTypeBeforeAndAfterOthers(5, new Foo()); diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 3f022a7c..bde8ffcc 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -249,6 +249,10 @@ void MethodsWithDefaultValues::defaultChar(char c) { } +void MethodsWithDefaultValues::defaultEmptyChar(char c) +{ +} + void MethodsWithDefaultValues::defaultRefTypeBeforeOthers(Foo foo, int i, Bar::Items item) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 7df4f644..7a24bc37 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -219,6 +219,7 @@ public: void defaultPointer(Foo* ptr = 0); void defaultValueType(ValueType bar = ValueType()); void defaultChar(char c = 'a'); + void defaultEmptyChar(char c = 0); void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2); void defaultRefTypeAfterOthers(int i = 5, Bar::Items item = Bar::Item2, Foo foo = Foo()); void defaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz());