//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 #include #include #include "support/timer.h" 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(int, char**) { test(); return 0; } /* 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 */