//===--------------------- inherited_exception.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <assert.h>
struct Base {
int b1;
};
struct Base2 {
int b2;
};
struct Child : public Base, public Base2 {
int c;
};
void f1() {
Child child;
child.b1 = 10;
child.b2 = 11;
child.c = 12;
throw child;
}
void f2() {
Child child;
child.b1 = 10;
child.b2 = 11;
child.c = 12;
throw static_cast<Base2&>(child);
}
void f3() {
Child* child = new Child;
child->b1 = 10;
child->b2 = 11;
child->c = 12;
throw static_cast<Base2*>(child);
}
int main()
{
try
{
f1();
assert(false);
}
catch (const Child& c)
{
assert(true);
}
catch (const Base& b)
{
assert(false);
}
catch (...)
{
assert(false);
}
try
{
f1();
assert(false);
}
catch (const Base& c)
{
assert(true);
}
catch (const Child& b)
{
assert(false);
}
catch (...)
{
assert(false);
}
try
{
f1();
assert(false);
}
catch (const Base2& c)
{
assert(true);
}
catch (const Child& b)
{
assert(false);
}
catch (...)
{
assert(false);
}
try
{
f2();
assert(false);
}
catch (const Child& c)
{
assert(false);
}
catch (const Base& b)
{
assert(false);
}
catch (const Base2& b)
{
assert(true);
}
catch (...)
{
assert(false);
}
try
{
f3();
assert(false);
}
catch (const Base* c)
{
assert(false);
}
catch (const Child* b)
{
assert(false);
}
catch (const Base2* c)
{
assert(true);
}
catch (...)
{
assert(false);
}
}