Browse Source

A test for the crash when using multiple inheritance and calling a virtual function from a secondary base.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/719/head
Dimitar Dobrev 10 years ago committed by Dimitar Dobrev
parent
commit
baee5fd5a8
  1. 13
      tests/CSharp/CSharp.Tests.cs
  2. 30
      tests/CSharp/CSharp.cpp
  3. 24
      tests/CSharp/CSharp.h

13
tests/CSharp/CSharp.Tests.cs

@ -647,4 +647,17 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -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();
}
}
}
}

30
tests/CSharp/CSharp.cpp

@ -1191,3 +1191,33 @@ void HasSecondaryBaseWithAbstractWithDefaultArg::abstract(const Foo& foo) @@ -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;
}

24
tests/CSharp/CSharp.h

@ -1067,3 +1067,27 @@ public: @@ -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;
};

Loading…
Cancel
Save