1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li struct X { int i; float f; };
4*67e74705SXin Li struct Y { X x; };
5*67e74705SXin Li
6*67e74705SXin Li // CHECK-LABEL: define void @_Z21reinterpret_cast_testRiRfR1X
reinterpret_cast_test(int & ir,float & fr,X & xr)7*67e74705SXin Li void reinterpret_cast_test(int &ir, float &fr, X &xr) {
8*67e74705SXin Li // CHECK: load float*, float**
9*67e74705SXin Li // CHECK: bitcast float*
10*67e74705SXin Li // CHECK: load i32, i32*
11*67e74705SXin Li ir = reinterpret_cast<int&>(fr);
12*67e74705SXin Li // CHECK: load
13*67e74705SXin Li // CHECK: {{bitcast.*to i32\*}}
14*67e74705SXin Li // CHECK: load i32, i32*
15*67e74705SXin Li ir = reinterpret_cast<int&>(xr);
16*67e74705SXin Li // CHECK: load i32
17*67e74705SXin Li // CHECK: {{bitcast.*to float\*}}
18*67e74705SXin Li // CHECK: load float, float*
19*67e74705SXin Li fr = reinterpret_cast<float&>(ir);
20*67e74705SXin Li // CHECK: load
21*67e74705SXin Li // CHECK: {{bitcast.*to float\*}}
22*67e74705SXin Li // CHECK: load float, float*
23*67e74705SXin Li fr = reinterpret_cast<float&>(xr);
24*67e74705SXin Li // CHECK: load i32*, i32**
25*67e74705SXin Li // CHECK: bitcast i32*
26*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
27*67e74705SXin Li xr = reinterpret_cast<X&>(ir);
28*67e74705SXin Li // CHECK: load float*, float**
29*67e74705SXin Li // CHECK: bitcast float*
30*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
31*67e74705SXin Li xr = reinterpret_cast<X&>(fr);
32*67e74705SXin Li _Complex float cf;
33*67e74705SXin Li _Complex float &cfr = cf;
34*67e74705SXin Li // CHECK: load i32*, i32**
35*67e74705SXin Li // CHECK: bitcast i32*
36*67e74705SXin Li // CHECK: load float, float*
37*67e74705SXin Li // CHECK: load float, float*
38*67e74705SXin Li cfr = reinterpret_cast<_Complex float&>(ir);
39*67e74705SXin Li // CHECK: load float*, float**
40*67e74705SXin Li // CHECK: bitcast float*
41*67e74705SXin Li // CHECK: load float, float*
42*67e74705SXin Li // CHECK: load float, float*
43*67e74705SXin Li cfr = reinterpret_cast<_Complex float&>(fr);
44*67e74705SXin Li // CHECK: bitcast
45*67e74705SXin Li // CHECK: load float, float*
46*67e74705SXin Li // CHECK: load float, float*
47*67e74705SXin Li cfr = reinterpret_cast<_Complex float&>(xr);
48*67e74705SXin Li // CHECK: ret void
49*67e74705SXin Li }
50*67e74705SXin Li
51*67e74705SXin Li // CHECK-LABEL: define void @_Z6c_castRiRfR1X
c_cast(int & ir,float & fr,X & xr)52*67e74705SXin Li void c_cast(int &ir, float &fr, X &xr) {
53*67e74705SXin Li // CHECK: load float*, float**
54*67e74705SXin Li // CHECK: bitcast float*
55*67e74705SXin Li // CHECK: load i32, i32*
56*67e74705SXin Li ir = (int&)fr;
57*67e74705SXin Li // CHECK: load
58*67e74705SXin Li // CHECK: {{bitcast.*to i32\*}}
59*67e74705SXin Li // CHECK: load i32, i32*
60*67e74705SXin Li ir = (int&)xr;
61*67e74705SXin Li // CHECK: load i32
62*67e74705SXin Li // CHECK: {{bitcast.*to float\*}}
63*67e74705SXin Li // CHECK: load float, float*
64*67e74705SXin Li fr = (float&)ir;
65*67e74705SXin Li // CHECK: load
66*67e74705SXin Li // CHECK: {{bitcast.*to float\*}}
67*67e74705SXin Li // CHECK: load float, float*
68*67e74705SXin Li fr = (float&)xr;
69*67e74705SXin Li // CHECK: load i32*, i32**
70*67e74705SXin Li // CHECK: bitcast i32*
71*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
72*67e74705SXin Li xr = (X&)ir;
73*67e74705SXin Li // CHECK: load float*, float**
74*67e74705SXin Li // CHECK: bitcast float*
75*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
76*67e74705SXin Li xr = (X&)fr;
77*67e74705SXin Li _Complex float cf;
78*67e74705SXin Li _Complex float &cfr = cf;
79*67e74705SXin Li // CHECK: load i32*, i32**
80*67e74705SXin Li // CHECK: bitcast i32*
81*67e74705SXin Li // CHECK: load float, float*
82*67e74705SXin Li // CHECK: load float, float*
83*67e74705SXin Li cfr = (_Complex float&)ir;
84*67e74705SXin Li // CHECK: load float*, float**
85*67e74705SXin Li // CHECK: bitcast float*
86*67e74705SXin Li // CHECK: load float, float*
87*67e74705SXin Li // CHECK: load float, float*
88*67e74705SXin Li cfr = (_Complex float&)fr;
89*67e74705SXin Li // CHECK: bitcast
90*67e74705SXin Li // CHECK: load float, float*
91*67e74705SXin Li // CHECK: load float, float*
92*67e74705SXin Li cfr = (_Complex float&)xr;
93*67e74705SXin Li // CHECK: ret void
94*67e74705SXin Li }
95*67e74705SXin Li
96*67e74705SXin Li // CHECK-LABEL: define void @_Z15functional_castRiRfR1X
functional_cast(int & ir,float & fr,X & xr)97*67e74705SXin Li void functional_cast(int &ir, float &fr, X &xr) {
98*67e74705SXin Li typedef int &intref;
99*67e74705SXin Li typedef float &floatref;
100*67e74705SXin Li typedef X &Xref;
101*67e74705SXin Li // CHECK: load float*, float**
102*67e74705SXin Li // CHECK: bitcast float*
103*67e74705SXin Li // CHECK: load i32, i32*
104*67e74705SXin Li ir = intref(fr);
105*67e74705SXin Li // CHECK: load
106*67e74705SXin Li // CHECK: {{bitcast.*to i32\*}}
107*67e74705SXin Li // CHECK: load i32, i32*
108*67e74705SXin Li ir = intref(xr);
109*67e74705SXin Li // CHECK: load i32
110*67e74705SXin Li // CHECK: {{bitcast.*to float\*}}
111*67e74705SXin Li // CHECK: load float, float*
112*67e74705SXin Li fr = floatref(ir);
113*67e74705SXin Li // CHECK: load
114*67e74705SXin Li // CHECK: {{bitcast.*to float\*}}
115*67e74705SXin Li // CHECK: load float, float*
116*67e74705SXin Li fr = floatref(xr);
117*67e74705SXin Li // CHECK: load i32*, i32**
118*67e74705SXin Li // CHECK: bitcast i32*
119*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
120*67e74705SXin Li xr = Xref(ir);
121*67e74705SXin Li // CHECK: load float*, float**
122*67e74705SXin Li // CHECK: bitcast float*
123*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
124*67e74705SXin Li xr = Xref(fr);
125*67e74705SXin Li typedef _Complex float &complex_float_ref;
126*67e74705SXin Li _Complex float cf;
127*67e74705SXin Li _Complex float &cfr = cf;
128*67e74705SXin Li // CHECK: load i32*, i32**
129*67e74705SXin Li // CHECK: bitcast i32*
130*67e74705SXin Li // CHECK: load float, float*
131*67e74705SXin Li // CHECK: load float, float*
132*67e74705SXin Li cfr = complex_float_ref(ir);
133*67e74705SXin Li // CHECK: load float*, float**
134*67e74705SXin Li // CHECK: bitcast float*
135*67e74705SXin Li // CHECK: load float, float*
136*67e74705SXin Li // CHECK: load float, float*
137*67e74705SXin Li cfr = complex_float_ref(fr);
138*67e74705SXin Li // CHECK: bitcast
139*67e74705SXin Li // CHECK: load float, float*
140*67e74705SXin Li // CHECK: load float, float*
141*67e74705SXin Li cfr = complex_float_ref(xr);
142*67e74705SXin Li // CHECK: ret void
143*67e74705SXin Li }
144*67e74705SXin Li
145*67e74705SXin Li namespace PR6437 {
146*67e74705SXin Li struct in_addr {};
copy(const struct in_addr & new_addr)147*67e74705SXin Li void copy( const struct in_addr &new_addr ) {
148*67e74705SXin Li int addr = (int&)new_addr;
149*67e74705SXin Li }
150*67e74705SXin Li }
151*67e74705SXin Li
152*67e74705SXin Li namespace PR7593 {
foo(double & X,char * A)153*67e74705SXin Li void foo(double &X, char *A) {
154*67e74705SXin Li X = reinterpret_cast<double&>(A[4]);
155*67e74705SXin Li }
156*67e74705SXin Li }
157*67e74705SXin Li
158*67e74705SXin Li namespace PR7344 {
serialize_annotatable_id(void * & id)159*67e74705SXin Li void serialize_annotatable_id( void*& id )
160*67e74705SXin Li {
161*67e74705SXin Li unsigned long l_id = (unsigned long&)id;
162*67e74705SXin Li }
163*67e74705SXin Li }
164