From d583b489a3cc357dca49f8526c8c6c064fcf6a95 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 10 Dec 2013 02:20:06 +0200 Subject: [PATCH] Fixed the returning of empty values when the returned type is a structure. Signed-off-by: Dimitar Dobrev --- src/AST/Type.cs | 6 ++++++ .../Generators/CSharp/CSharpTextTemplate.cs | 19 ++++++++++++++----- tests/Basic/Basic.cpp | 5 +++++ tests/Basic/Basic.h | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/AST/Type.cs b/src/AST/Type.cs index ac2ce94b..39b0ac5e 100644 --- a/src/AST/Type.cs +++ b/src/AST/Type.cs @@ -13,6 +13,12 @@ namespace CppSharp.AST public bool IsDependent { get; set; } + public bool IsPrimitiveType() + { + PrimitiveType type; + return IsPrimitiveType(out type); + } + public bool IsPrimitiveType(out PrimitiveType primitive) { var builtin = this as BuiltinType; diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 557768f9..a51519ab 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -2068,11 +2068,20 @@ namespace CppSharp.Generators.CSharp Type pointee; if (retType.Type.IsPointerTo(out pointee) && isIntPtr) { - PrimitiveType primitive; - string @null = (pointee.Desugar().IsPrimitiveType(out primitive) || - pointee.Desugar().IsPointer()) && - !CSharpTypePrinter.IsConstCharString(retType) ? - "IntPtr.Zero" : "null"; + pointee = pointee.Desugar(); + string @null; + Class @class; + if (pointee.IsTagDecl(out @class) && @class.IsValueType) + { + @null = string.Format("new {0}()", pointee); + } + else + { + @null = (pointee.IsPrimitiveType() || + pointee.IsPointer()) && + !CSharpTypePrinter.IsConstCharString(retType) ? + "IntPtr.Zero" : "null"; + } WriteLine("if ({0} == global::System.IntPtr.Zero) return {1};", Generator.GeneratedIdentifier("ret"), @null); } diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index b6b15b1b..390b6c4b 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -32,6 +32,11 @@ Bar::Item Bar::RetItem1() return Bar::Item1; } +Bar* Bar::returnPointerToValueType() +{ + return this; +} + Bar2::Nested::operator int() const { return 300; diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 859462a4..7f35690b 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -43,6 +43,8 @@ struct DLL_API Bar Item RetItem1(); int A; float B; + + Bar* returnPointerToValueType(); }; struct DLL_API Bar2 : public Bar