//===------------------------- dynamic_cast_stress.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. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03 #include #include #include "support/timer.hpp" template struct C : public virtual C, public virtual C { virtual ~C() {} }; template struct C { virtual ~C() {} }; template struct B : public virtual C, public virtual C { }; template struct makeB; template struct makeB, Depth> : public B... { }; template struct A : public makeB::type, Depth> { }; void test() { const std::size_t Width = 10; const std::size_t Depth = 5; A a; typedef B Destination; // typedef A Destination; Destination *b = nullptr; { timer t; b = dynamic_cast((C*)&a); } assert(b != 0); } int main() { test(); } /* Timing results I'm seeing (median of 3 microseconds): libc++abi gcc's dynamic_cast B -O3 48.334 93.190 libc++abi 93% faster B -Os 58.535 94.103 libc++abi 61% faster A -O3 11.515 33.134 libc++abi 188% faster A -Os 12.631 31.553 libc++abi 150% faster */