1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// PR c++/57599
// { dg-do compile { target c++11 } }
struct A { };
struct B : public A { };
template<class, class>
struct is_same { static constexpr bool value = false; };
template<class T>
struct is_same<T, T> { static constexpr bool value = true; };
template<class T>
T val();
static_assert(is_same<decltype(dynamic_cast<A*>(val<B*>())),
A*>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<A&>(val<B&>())),
A&>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<const A*>(val<B*>())),
const A*>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<const A&>(val<B&>())),
const A&>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<volatile A*>(val<B*>())),
volatile A*>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<volatile A&>(val<B&>())),
volatile A&>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<const volatile A*>(val<B*>())),
const volatile A*>::value, "Ouch");
static_assert(is_same<decltype(dynamic_cast<const volatile A&>(val<B&>())),
const volatile A&>::value, "Ouch");
|