1/* { dg-do compile } */
2
3typedef __SIZE_TYPE__ size_t;
4extern "C" void *memcpy (void *, __const void *, size_t);
5template < class Dest, class Source > struct BitCastHelper {
6    static Dest cast (const Source & source) __attribute__ ((always_inline)) {
7	Dest dest;
8	memcpy (0, &source, sizeof dest);
9    }
10};
11template < class Dest, class Source > Dest BitCast (Source)
12{
13  BitCastHelper < Dest, Source >::cast (0);
14}
15
16class MaybeObject
17{
18};
19class Object:MaybeObject
20{
21public:
22    static Object *cast (Object *) {
23    }
24};
25class HeapObject:public Object
26{
27};
28class String:public HeapObject
29{
30};
31class ExternalString:public String
32{
33};
34class ExternalTwoByteString:public ExternalString
35{
36};
37
38template < typename T > class Handle
39{
40public:
41    Handle () {
42    }
43    T *operator* () const;
44    template < class S > static Handle < T > cast (Handle < S > that) {
45	T::cast (*that);
46    }
47    T **location_;
48};
49
50template < typename T > T * Handle < T >::operator* () const
51{
52  *BitCast < T ** >(location_);
53}
54
55void
56TestCharacterStream ()
57{
58  Handle < String > uc16_string;
59  Handle < ExternalTwoByteString >::cast (uc16_string);
60}
61