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