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