diff options
author | Eric Fiselier <eric@efcs.ca> | 2018-05-18 20:42:53 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2018-05-18 20:42:53 +0000 |
commit | ea1884b7af5d66e053c41f061524de3cb98fd656 (patch) | |
tree | 64af695726912059ba46b9d46fcd88f2b4883bf7 | |
parent | afe9f90d0b43d39309bcf4f6ef1a34fcc7e9f15d (diff) |
private_typeinfo: propagate static flags in vmi search_above_dst method
This adds the test which was mistakenly not committed in r332763.
Patch by Ryan Prichard
Propagate the found_our_static_ptr and found_any_static_type flags from
__vmi_class_type_info::search_above_dst to its caller.
Fixes PR33425 and PR33487
Reviewed as https://reviews.llvm.org/D36446
git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@332764 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/dynamic_cast.pass.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/test/dynamic_cast.pass.cpp b/test/dynamic_cast.pass.cpp new file mode 100644 index 0000000..cd24798 --- /dev/null +++ b/test/dynamic_cast.pass.cpp @@ -0,0 +1,103 @@ +//===------------------------- dynamic_cast.pass.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 <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 + +int main() +{ + t1::test(); + t2::test(); + t3::test(); +} |