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