Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

1325 lines
43 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include <cassert>
#include "support/timer.h"
// This test explicitly tests dynamic cast with types that have inaccessible
// bases.
#if defined(__clang__)
# pragma clang diagnostic ignored "-Winaccessible-base"
#elif defined(__GNUC__)
# pragma GCC diagnostic ignored "-Winaccessible-base"
#endif
namespace t1
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public virtual A1,
private A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A3,
public A2
{
char _[13489];
virtual ~A4() {}
t1::A1* getA1() {return A3::getA1();}
A2* getA2() {return A3::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return this;}
};
struct A5
: public A4,
public A3
{
char _[13489];
virtual ~A5() {}
t1::A1* getA1() {return A4::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A4::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == 0);
assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == 0);
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
// assert(dynamic_cast<A2*>(a3.getA3()) == 0); // cast to private base
assert(dynamic_cast<A2*>(a4.getA1()) == 0);
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
// assert(dynamic_cast<A2*>(a4.getA3()) == 0); // cast to private base
// assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
assert(dynamic_cast<A2*>(a5.getA1()) == 0);
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
// assert(dynamic_cast<A2*>(a5.getA3()) == 0); // cast to private base
// assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
// assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
assert(dynamic_cast<A3*>(a5.getA1()) == 0);
assert(dynamic_cast<A3*>(a5.getA2()) == 0);
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
// assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == 0);
assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA2()) == 0);
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == 0);
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t1
namespace t2
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public virtual A1,
public A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A3,
public A2
{
char _[13489];
virtual ~A4() {}
t2::A1* getA1() {return A3::getA1();}
A2* getA2() {return A3::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return this;}
};
struct A5
: public A4,
public A3
{
char _[13489];
virtual ~A5() {}
t2::A1* getA1() {return A4::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A4::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == 0);
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
// assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
assert(dynamic_cast<A2*>(a5.getA1()) == 0);
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
// assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
// assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
assert(dynamic_cast<A3*>(a5.getA1()) == 0);
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
// assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t2
namespace t3
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public A1,
public virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A1,
public virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: public A3,
public A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t3
namespace t4
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: protected A1,
public virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A1,
public virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: public A3,
public A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == 0);
// assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); // cast to protected base
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
// assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); // cast to protected base
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == 0);
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA13()) == 0);
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == 0);
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA13()) == 0);
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA13()) == 0);
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA13()) == 0);
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t4
namespace t5
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public A1,
protected virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A1,
public virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: public A3,
public A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == 0);
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
// assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); // cast to protected base
assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
// assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); // cast to protected base
assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t5
namespace t6
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public A1,
public virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: protected A1,
public virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: public A3,
public A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == 0);
// assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); // cast to protected base
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
// assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); // cast to protected base
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == 0);
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
assert(dynamic_cast<A2*>(a5.getA14()) == 0);
assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == 0);
assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == 0);
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == 0);
assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == 0);
assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t6
namespace t7
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public A1,
public virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A1,
protected virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: public A3,
public A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == 0);
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == 0);
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
// assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); // cast to protected base
assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
// assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); // cast to protected base
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == 0);
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t7
namespace t8
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public A1,
public virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A1,
public virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: protected A3,
public A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA13()) == 0);
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == 0);
assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == 0);
// assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); // cast to protected base
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA13()) == 0);
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == 0);
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA13()) == 0);
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == 0);
assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t8
namespace t9
{
struct A1
{
char _[43981];
virtual ~A1() {}
A1* getA1() {return this;}
};
struct A2
{
char _[34981];
virtual ~A2() {}
A2* getA2() {return this;}
};
struct A3
: public A1,
public virtual A2
{
char _[93481];
virtual ~A3() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A3* getA3() {return this;}
};
struct A4
: public A1,
public virtual A2
{
char _[13489];
virtual ~A4() {}
A1* getA1() {return A1::getA1();}
A2* getA2() {return A2::getA2();}
A4* getA4() {return this;}
};
struct A5
: public A3,
protected A4
{
char _[41389];
virtual ~A5() {}
A1* getA14() {return A4::getA1();}
A1* getA13() {return A3::getA1();}
A2* getA2() {return A4::getA2();}
A3* getA3() {return A3::getA3();}
A4* getA4() {return A4::getA4();}
A5* getA5() {return this;}
};
void test()
{
A1 a1;
A2 a2;
A3 a3;
A4 a4;
A5 a5;
assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
assert(dynamic_cast<A1*>(a2.getA2()) == 0);
assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA2()) == 0);
assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
assert(dynamic_cast<A2*>(a1.getA1()) == 0);
assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
assert(dynamic_cast<A2*>(a5.getA14()) == 0);
assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
assert(dynamic_cast<A3*>(a1.getA1()) == 0);
assert(dynamic_cast<A3*>(a2.getA2()) == 0);
assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
assert(dynamic_cast<A3*>(a4.getA1()) == 0);
assert(dynamic_cast<A3*>(a4.getA2()) == 0);
assert(dynamic_cast<A3*>(a4.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA14()) == 0);
assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
assert(dynamic_cast<A3*>(a5.getA4()) == 0);
assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
assert(dynamic_cast<A4*>(a1.getA1()) == 0);
assert(dynamic_cast<A4*>(a2.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA1()) == 0);
assert(dynamic_cast<A4*>(a3.getA2()) == 0);
assert(dynamic_cast<A4*>(a3.getA3()) == 0);
assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA13()) == 0);
assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
assert(dynamic_cast<A4*>(a5.getA3()) == 0);
assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
// assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); // cast to protected base
assert(dynamic_cast<A5*>(a1.getA1()) == 0);
assert(dynamic_cast<A5*>(a2.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA1()) == 0);
assert(dynamic_cast<A5*>(a3.getA2()) == 0);
assert(dynamic_cast<A5*>(a3.getA3()) == 0);
assert(dynamic_cast<A5*>(a4.getA1()) == 0);
assert(dynamic_cast<A5*>(a4.getA2()) == 0);
assert(dynamic_cast<A5*>(a4.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA14()) == 0);
assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
assert(dynamic_cast<A5*>(a5.getA4()) == 0);
assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
}
} // t9
int main(int, char**)
{
timer t;
t1::test();
t2::test();
t3::test();
t4::test();
t5::test();
t6::test();
t7::test();
t8::test();
t9::test();
return 0;
}