From 9752096a4c100c2a19c49710b331abc232979135 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sat, 31 Aug 2013 23:06:34 +0300 Subject: [PATCH] Fixed a bug in MS mode and added a test. Signed-off-by: Dimitar Dobrev --- src/AST/ClassLayout.cs | 7 +++++-- src/Generator/Generators/CSharp/CSharpTextTemplate.cs | 2 +- tests/Basic/Basic.Tests.cs | 8 ++++++++ tests/Basic/Basic.cpp | 7 ++++++- tests/Basic/Basic.h | 11 ++++++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/AST/ClassLayout.cs b/src/AST/ClassLayout.cs index 3721dda4..1377f37e 100644 --- a/src/AST/ClassLayout.cs +++ b/src/AST/ClassLayout.cs @@ -99,8 +99,11 @@ namespace CppSharp.AST Size = classLayout.Size; DataSize = classLayout.DataSize; VFTables.AddRange(classLayout.VFTables); - Layout = new VTableLayout(); - Layout.Components.AddRange(classLayout.Layout.Components); + if (classLayout.Layout != null) + { + Layout = new VTableLayout(); + Layout.Components.AddRange(classLayout.Layout.Components); + } } /// diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 03230e20..e2284d4d 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -1566,7 +1566,7 @@ namespace CppSharp.Generators.CSharp case CppAbi.Microsoft: i = (from table in @class.Layout.VFTables let j = table.Layout.Components.FindIndex(m => m.Method == method) - where j > 0 + where j >= 0 select j).First(); break; default: diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index f2092642..68992b2c 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -85,5 +85,13 @@ public class BasicTests Foo2 result = foo2 << 3; Assert.That(result.C, Is.EqualTo(16)); } + + [Test] + public void TestAbstractReturnType() + { + var returnsAbstractFoo = new ReturnsAbstractFoo(); + AbstractFoo abstractFoo = returnsAbstractFoo.getFoo(); + Assert.AreEqual(abstractFoo.pureFunction(), 5); + } } \ No newline at end of file diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index de9ace33..6923c8f5 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -121,11 +121,16 @@ Bar indirectReturn() return Bar(); } -int ImplementAbstractFoo::pureFunction() +int ImplementsAbstractFoo::pureFunction() { return 5; } +const AbstractFoo& ReturnsAbstractFoo::getFoo() +{ + return i; +} + void DefaultParameters::Foo(int a, int b) { } diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index ee698006..9bc87f57 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -86,12 +86,21 @@ public: virtual int pureFunction() = 0; }; -class DLL_API ImplementAbstractFoo : public AbstractFoo +class DLL_API ImplementsAbstractFoo : public AbstractFoo { public: virtual int pureFunction(); }; +class DLL_API ReturnsAbstractFoo +{ +public: + const AbstractFoo& getFoo(); + +private: + ImplementsAbstractFoo i; +}; + DLL_API Bar operator-(const Bar &); DLL_API Bar operator+(const Bar &, const Bar &);