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
7 void 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);
32   _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);
48   // CHECK: ret void
49 }
50 
51 // CHECK-LABEL: define void @_Z6c_castRiRfR1X
52 void 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;
77   _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;
93   // CHECK: ret void
94 }
95 
96 // CHECK-LABEL: define void @_Z15functional_castRiRfR1X
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**
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);
125   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);
142   // CHECK: ret void
143 }
144 
145 namespace PR6437 {
146   struct in_addr {};
147   void copy( const struct in_addr &new_addr ) {
148     int addr = (int&)new_addr;
149   }
150 }
151 
152 namespace PR7593 {
153   void foo(double &X, char *A) {
154     X = reinterpret_cast<double&>(A[4]);
155   }
156 }
157 
158 namespace PR7344 {
159   void serialize_annotatable_id( void*& id )
160   {
161     unsigned long l_id = (unsigned long&)id;
162   }
163 }
164