Mercurial > hg > CbC > CbC_llvm
diff libcxxabi/test/dynamic_cast.pass.cpp @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | 2e18cbf3894f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcxxabi/test/dynamic_cast.pass.cpp Thu Feb 13 15:10:13 2020 +0900 @@ -0,0 +1,153 @@ +//===------------------------- dynamic_cast.pass.cpp ----------------------===// +// +// 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> + +// This test explicitly tests dynamic cast with types that have inaccessible +// bases. +#if defined(__clang__) +#pragma clang diagnostic ignored "-Winaccessible-base" +#endif + +typedef char Pad1[43981]; +typedef char Pad2[34981]; +typedef char Pad3[93481]; +typedef char Pad4[13489]; +typedef char Pad5[81349]; +typedef char Pad6[34819]; +typedef char Pad7[3489]; + +namespace t1 +{ + +// PR33425 +struct C3 { virtual ~C3() {} Pad1 _; }; +struct C5 : protected virtual C3 { Pad2 _; }; +struct C6 : virtual C5 { Pad3 _; }; +struct C7 : virtual C3 { Pad4 _; }; +struct C9 : C6, C7 { Pad5 _; }; + +C9 c9; +C3 *c3 = &c9; + +void test() +{ + assert(dynamic_cast<C3*>(c3) == static_cast<C3*>(&c9)); + assert(dynamic_cast<C5*>(c3) == static_cast<C5*>(&c9)); + assert(dynamic_cast<C6*>(c3) == static_cast<C6*>(&c9)); + assert(dynamic_cast<C7*>(c3) == static_cast<C7*>(&c9)); + assert(dynamic_cast<C9*>(c3) == static_cast<C9*>(&c9)); +} + +} // t1 + +namespace t2 +{ + +// PR33425 +struct Src { virtual ~Src() {} Pad1 _; }; +struct Mask : protected virtual Src { Pad2 _; }; +struct Dest : Mask { Pad3 _; }; +struct Root : Dest, virtual Src { Pad4 _; }; + +Root root; +Src *src = &root; + +void test() +{ + assert(dynamic_cast<Src*>(src) == static_cast<Src*>(&root)); + assert(dynamic_cast<Mask*>(src) == static_cast<Mask*>(&root)); + assert(dynamic_cast<Dest*>(src) == static_cast<Dest*>(&root)); + assert(dynamic_cast<Root*>(src) == static_cast<Root*>(&root)); +} + +} // t2 + +namespace t3 +{ + +// PR33487 +struct Class1 { virtual ~Class1() {} Pad1 _; }; +struct Shared : virtual Class1 { Pad2 _; }; +struct Class6 : virtual Shared { Pad3 _; }; +struct Left : Class6 { Pad4 _; }; +struct Right : Class6 { Pad5 _; }; +struct Main : Left, Right { Pad6 _; }; + +Main m; +Class1 *c1 = &m; + +void test() +{ + assert(dynamic_cast<Class1*>(c1) == static_cast<Class1*>(&m)); + assert(dynamic_cast<Shared*>(c1) == static_cast<Shared*>(&m)); + assert(dynamic_cast<Class6*>(c1) == 0); + assert(dynamic_cast<Left*>(c1) == static_cast<Left*>(&m)); + assert(dynamic_cast<Right*>(c1) == static_cast<Right*>(&m)); + assert(dynamic_cast<Main*>(c1) == static_cast<Main*>(&m)); +} + +} // t3 + +namespace t4 +{ + +// PR33439 +struct C2 { virtual ~C2() {} Pad1 _; }; +struct C3 { virtual ~C3() {} Pad2 _; }; +struct C4 : C3 { Pad3 _; }; +struct C8 : C2, virtual C4 { Pad4 _; }; +struct C9 : C4, C8 { Pad5 _; }; + +C9 c9; +C2 *c2 = &c9; + +void test() +{ + assert(dynamic_cast<C2*>(c2) == static_cast<C2*>(&c9)); + assert(dynamic_cast<C3*>(c2) == 0); + assert(dynamic_cast<C4*>(c2) == 0); + assert(dynamic_cast<C8*>(c2) == static_cast<C8*>(&c9)); + assert(dynamic_cast<C9*>(c2) == static_cast<C9*>(&c9)); +} + +} // t4 + +namespace t5 +{ + +// PR33439 +struct Dummy { virtual ~Dummy() {} Pad1 _; }; +struct Src { virtual ~Src() {} Pad2 _; }; +struct Dest : Dummy { Pad3 _; }; +struct A1 : Dest { Pad4 _; }; +struct A2 : Dest { Pad5 _; }; +struct Root : Src, A1, A2 { Pad6 _; }; + +Root root; +Src *src = &root; + +void test() +{ + assert(dynamic_cast<Dummy*>(src) == 0); + assert(dynamic_cast<Src*>(src) == static_cast<Src*>(&root)); + assert(dynamic_cast<Dest*>(src) == 0); + assert(dynamic_cast<A1*>(src) == static_cast<A1*>(&root)); + assert(dynamic_cast<A2*>(src) == static_cast<A2*>(&root)); +} + +} // t5 + +int main() +{ + t1::test(); + t2::test(); + t3::test(); + t4::test(); + t5::test(); +}