137 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s2 3struct X { int i; float f; };4struct Y { X x; };5 6// CHECK-LABEL: define{{.*}} void @_Z21reinterpret_cast_testRiRfR1X7void reinterpret_cast_test(int &ir, float &fr, X &xr) {8 // CHECK: load ptr, ptr9 // CHECK: load i32, ptr10 ir = reinterpret_cast<int&>(fr);11 // CHECK: load12 // CHECK: load i32, ptr13 ir = reinterpret_cast<int&>(xr);14 // CHECK: load ptr15 // CHECK: load float, ptr16 fr = reinterpret_cast<float&>(ir);17 // CHECK: load18 // CHECK: load float, ptr19 fr = reinterpret_cast<float&>(xr);20 // CHECK: load ptr, ptr21 // CHECK: call void @llvm.memcpy.p0.p0.i6422 xr = reinterpret_cast<X&>(ir);23 // CHECK: load ptr, ptr24 // CHECK: call void @llvm.memcpy.p0.p0.i6425 xr = reinterpret_cast<X&>(fr);26 _Complex float cf;27 _Complex float &cfr = cf;28 // CHECK: load ptr, ptr29 // CHECK: load float, ptr30 // CHECK: load float, ptr31 cfr = reinterpret_cast<_Complex float&>(ir);32 // CHECK: load ptr, ptr33 // CHECK: load float, ptr34 // CHECK: load float, ptr35 cfr = reinterpret_cast<_Complex float&>(fr);36 // CHECK: load float, ptr37 // CHECK: load float, ptr38 cfr = reinterpret_cast<_Complex float&>(xr);39 // CHECK: ret void40}41 42// CHECK-LABEL: define{{.*}} void @_Z6c_castRiRfR1X43void c_cast(int &ir, float &fr, X &xr) {44 // CHECK: load ptr, ptr45 // CHECK: load i32, ptr46 ir = (int&)fr;47 // CHECK: load48 // CHECK: load i32, ptr49 ir = (int&)xr;50 // CHECK: load ptr51 // CHECK: load float, ptr52 fr = (float&)ir;53 // CHECK: load54 // CHECK: load float, ptr55 fr = (float&)xr;56 // CHECK: load ptr, ptr57 // CHECK: call void @llvm.memcpy.p0.p0.i6458 xr = (X&)ir;59 // CHECK: load ptr, ptr60 // CHECK: call void @llvm.memcpy.p0.p0.i6461 xr = (X&)fr;62 _Complex float cf;63 _Complex float &cfr = cf;64 // CHECK: load ptr, ptr65 // CHECK: load float, ptr66 // CHECK: load float, ptr67 cfr = (_Complex float&)ir;68 // CHECK: load ptr, ptr69 // CHECK: load float, ptr70 // CHECK: load float, ptr71 cfr = (_Complex float&)fr;72 // CHECK: load float, ptr73 // CHECK: load float, ptr74 cfr = (_Complex float&)xr;75 // CHECK: ret void76}77 78// CHECK-LABEL: define{{.*}} void @_Z15functional_castRiRfR1X79void functional_cast(int &ir, float &fr, X &xr) {80 typedef int &intref;81 typedef float &floatref;82 typedef X &Xref;83 // CHECK: load ptr, ptr84 // CHECK: load i32, ptr85 ir = intref(fr);86 // CHECK: load87 // CHECK: load i32, ptr88 ir = intref(xr);89 // CHECK: load ptr90 // CHECK: load float, ptr91 fr = floatref(ir);92 // CHECK: load93 // CHECK: load float, ptr94 fr = floatref(xr);95 // CHECK: load ptr, ptr96 // CHECK: call void @llvm.memcpy.p0.p0.i6497 xr = Xref(ir);98 // CHECK: load ptr, ptr99 // CHECK: call void @llvm.memcpy.p0.p0.i64100 xr = Xref(fr);101 typedef _Complex float &complex_float_ref;102 _Complex float cf;103 _Complex float &cfr = cf;104 // CHECK: load ptr, ptr105 // CHECK: load float, ptr106 // CHECK: load float, ptr107 cfr = complex_float_ref(ir);108 // CHECK: load ptr, ptr109 // CHECK: load float, ptr110 // CHECK: load float, ptr111 cfr = complex_float_ref(fr);112 // CHECK: load float, ptr113 // CHECK: load float, ptr114 cfr = complex_float_ref(xr);115 // CHECK: ret void116}117 118namespace PR6437 {119 struct in_addr {};120 void copy( const struct in_addr &new_addr ) {121 int addr = (int&)new_addr;122 }123}124 125namespace PR7593 {126 void foo(double &X, char *A) {127 X = reinterpret_cast<double&>(A[4]);128 }129}130 131namespace PR7344 {132 void serialize_annotatable_id( void*& id )133 {134 unsigned long l_id = (unsigned long&)id;135 }136}137