diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index 135cad03..7de9c57d 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -647,4 +647,17 @@ public unsafe class CSharpTests : GeneratorTestFixture return base.HasPointerToEnumInParam(pointerToEnum); } } + + [Test] + public void TestStackOverflowOnVirtualCall() + { + using (var hasMissingObjectOnVirtualCall = new HasMissingObjectOnVirtualCall()) + { + using (var missingObjectOnVirtualCall = new MissingObjectOnVirtualCall()) + { + hasMissingObjectOnVirtualCall.SetMissingObjectOnVirtualCall(missingObjectOnVirtualCall); + hasMissingObjectOnVirtualCall.MakeMissingObjectOnVirtualCall(); + } + } + } } diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index cce41f21..ddb12581 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1191,3 +1191,33 @@ void HasSecondaryBaseWithAbstractWithDefaultArg::abstract(const Foo& foo) void HasSecondaryBaseWithAbstractWithDefaultArg::abstractWithNoDefaultArg(const Foo& foo) { } + +MissingObjectOnVirtualCallSecondaryBase::MissingObjectOnVirtualCallSecondaryBase() +{ +} + +void MissingObjectOnVirtualCallSecondaryBase::f() +{ +} + +MissingObjectOnVirtualCall::MissingObjectOnVirtualCall() +{ +} + +void MissingObjectOnVirtualCall::f() +{ +} + +HasMissingObjectOnVirtualCall::HasMissingObjectOnVirtualCall() +{ +} + +void HasMissingObjectOnVirtualCall::makeMissingObjectOnVirtualCall() +{ + stackOverflowOnVirtualCall->f(); +} + +void HasMissingObjectOnVirtualCall::setMissingObjectOnVirtualCall(MissingObjectOnVirtualCall* value) +{ + stackOverflowOnVirtualCall = value; +} diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 6d8927a9..ffe86843 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1067,3 +1067,27 @@ public: virtual void abstract(const Foo& foo = Foo()); virtual void abstractWithNoDefaultArg(const Foo& foo = Foo()); }; + +class DLL_API MissingObjectOnVirtualCallSecondaryBase +{ +public: + MissingObjectOnVirtualCallSecondaryBase(); + virtual void f(); +}; + +class DLL_API MissingObjectOnVirtualCall : public HasVirtualDtor1, public MissingObjectOnVirtualCallSecondaryBase +{ +public: + MissingObjectOnVirtualCall(); + void f(); +}; + +class DLL_API HasMissingObjectOnVirtualCall +{ +public: + HasMissingObjectOnVirtualCall(); + void makeMissingObjectOnVirtualCall(); + void setMissingObjectOnVirtualCall(MissingObjectOnVirtualCall* value); +private: + MissingObjectOnVirtualCall* stackOverflowOnVirtualCall; +};