// 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(fr); // CHECK: load // CHECK: {{bitcast.*to i32\*}} // CHECK: load i32, i32* ir = reinterpret_cast(xr); // CHECK: load i32 // CHECK: {{bitcast.*to float\*}} // CHECK: load float, float* fr = reinterpret_cast(ir); // CHECK: load // CHECK: {{bitcast.*to float\*}} // CHECK: load float, float* fr = reinterpret_cast(xr); // CHECK: load i32*, i32** // CHECK: bitcast i32* // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 xr = reinterpret_cast(ir); // CHECK: load float*, float** // CHECK: bitcast float* // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 xr = reinterpret_cast(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(A[4]); } } namespace PR7344 { void serialize_annotatable_id( void*& id ) { unsigned long l_id = (unsigned long&)id; } }