| // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s | 
 |  | 
 | struct X { int i; float f; }; | 
 | struct Y { X x; }; | 
 |  | 
 | // CHECK-LABEL: define void @_Z21reinterpret_cast_testRiRfR1X | 
 | void reinterpret_cast_test(int &ir, float &fr, X &xr) { | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: load i32, i32* | 
 |   ir = reinterpret_cast<int&>(fr); | 
 |   // CHECK: load | 
 |   // CHECK: {{bitcast.*to i32\*}} | 
 |   // CHECK: load i32, i32* | 
 |   ir = reinterpret_cast<int&>(xr); | 
 |   // CHECK: load i32 | 
 |   // CHECK: {{bitcast.*to float\*}} | 
 |   // CHECK: load float, float* | 
 |   fr = reinterpret_cast<float&>(ir); | 
 |   // CHECK: load | 
 |   // CHECK: {{bitcast.*to float\*}} | 
 |   // CHECK: load float, float* | 
 |   fr = reinterpret_cast<float&>(xr); | 
 |   // CHECK: load i32*, i32** | 
 |   // CHECK: bitcast i32* | 
 |   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
 |   xr = reinterpret_cast<X&>(ir); | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
 |   xr = reinterpret_cast<X&>(fr); | 
 |   _Complex float cf; | 
 |   _Complex float &cfr = cf; | 
 |   // CHECK: load i32*, i32** | 
 |   // CHECK: bitcast i32* | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = reinterpret_cast<_Complex float&>(ir); | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = reinterpret_cast<_Complex float&>(fr); | 
 |   // CHECK: bitcast | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = reinterpret_cast<_Complex float&>(xr); | 
 |   // CHECK: ret void | 
 | } | 
 |  | 
 | // CHECK-LABEL: define void @_Z6c_castRiRfR1X | 
 | void c_cast(int &ir, float &fr, X &xr) { | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: load i32, i32* | 
 |   ir = (int&)fr; | 
 |   // CHECK: load | 
 |   // CHECK: {{bitcast.*to i32\*}} | 
 |   // CHECK: load i32, i32* | 
 |   ir = (int&)xr; | 
 |   // CHECK: load i32 | 
 |   // CHECK: {{bitcast.*to float\*}} | 
 |   // CHECK: load float, float* | 
 |   fr = (float&)ir; | 
 |   // CHECK: load | 
 |   // CHECK: {{bitcast.*to float\*}} | 
 |   // CHECK: load float, float* | 
 |   fr = (float&)xr; | 
 |   // CHECK: load i32*, i32** | 
 |   // CHECK: bitcast i32* | 
 |   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
 |   xr = (X&)ir; | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
 |   xr = (X&)fr; | 
 |   _Complex float cf; | 
 |   _Complex float &cfr = cf; | 
 |   // CHECK: load i32*, i32** | 
 |   // CHECK: bitcast i32* | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = (_Complex float&)ir; | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = (_Complex float&)fr; | 
 |   // CHECK: bitcast | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = (_Complex float&)xr; | 
 |   // CHECK: ret void | 
 | } | 
 |  | 
 | // CHECK-LABEL: define void @_Z15functional_castRiRfR1X | 
 | void functional_cast(int &ir, float &fr, X &xr) { | 
 |   typedef int &intref; | 
 |   typedef float &floatref; | 
 |   typedef X &Xref; | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: load i32, i32* | 
 |   ir = intref(fr); | 
 |   // CHECK: load | 
 |   // CHECK: {{bitcast.*to i32\*}} | 
 |   // CHECK: load i32, i32* | 
 |   ir = intref(xr); | 
 |   // CHECK: load i32 | 
 |   // CHECK: {{bitcast.*to float\*}} | 
 |   // CHECK: load float, float* | 
 |   fr = floatref(ir); | 
 |   // CHECK: load | 
 |   // CHECK: {{bitcast.*to float\*}} | 
 |   // CHECK: load float, float* | 
 |   fr = floatref(xr); | 
 |   // CHECK: load i32*, i32** | 
 |   // CHECK: bitcast i32* | 
 |   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
 |   xr = Xref(ir); | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
 |   xr = Xref(fr); | 
 |   typedef _Complex float &complex_float_ref; | 
 |   _Complex float cf; | 
 |   _Complex float &cfr = cf; | 
 |   // CHECK: load i32*, i32** | 
 |   // CHECK: bitcast i32* | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = complex_float_ref(ir); | 
 |   // CHECK: load float*, float** | 
 |   // CHECK: bitcast float* | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = complex_float_ref(fr); | 
 |   // CHECK: bitcast | 
 |   // CHECK: load float, float* | 
 |   // CHECK: load float, float* | 
 |   cfr = complex_float_ref(xr); | 
 |   // CHECK: ret void | 
 | } | 
 |  | 
 | namespace PR6437 { | 
 |   struct in_addr {}; | 
 |   void copy( const struct in_addr &new_addr ) { | 
 |     int addr = (int&)new_addr; | 
 |   } | 
 | } | 
 |  | 
 | namespace PR7593 { | 
 |   void foo(double &X, char *A) { | 
 |     X = reinterpret_cast<double&>(A[4]); | 
 |   } | 
 | } | 
 |  | 
 | namespace PR7344 { | 
 |   void serialize_annotatable_id( void*& id ) | 
 |   { | 
 |     unsigned long l_id = (unsigned long&)id; | 
 |   } | 
 | } |