lvalue-bitcasts.cpp revision 93ab6bf534fb6c26563c00f28a8fc5581bb71dfd
1bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
2bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
3bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregorstruct X { int i; float f; };
4bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregorstruct Y { X x; };
5bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z21reinterpret_cast_testRiRfR1X
7bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregorvoid reinterpret_cast_test(int &ir, float &fr, X &xr) {
8bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float**
9bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
10bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32*
11bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = reinterpret_cast<int&>(fr);
12bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
13bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to i32\*}}
14bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32*
15bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = reinterpret_cast<int&>(xr);
16bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32
17bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
18bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float*
19bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = reinterpret_cast<float&>(ir);
20bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
21bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
22bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float*
23bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = reinterpret_cast<float&>(xr);
24bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32**
25bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast i32*
26bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
27bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = reinterpret_cast<X&>(ir);
28bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float**
29bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
30bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
31bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = reinterpret_cast<X&>(fr);
3277d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  _Complex float cf;
3377d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  _Complex float &cfr = cf;
3477d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load i32**
3577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast i32*
3677d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
3777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
3877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = reinterpret_cast<_Complex float&>(ir);
3977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float**
4077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast float*
4177d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
4277d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
4377d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = reinterpret_cast<_Complex float&>(fr);
4477d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast
4577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
4677d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
4777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = reinterpret_cast<_Complex float&>(xr);
48bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: ret void
49bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor}
50bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
5193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z6c_castRiRfR1X
52bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregorvoid c_cast(int &ir, float &fr, X &xr) {
53bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float**
54bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
55bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32*
56bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = (int&)fr;
57bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
58bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to i32\*}}
59bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32*
60bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = (int&)xr;
61bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32
62bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
63bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float*
64bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = (float&)ir;
65bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
66bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
67bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float*
68bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = (float&)xr;
69bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32**
70bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast i32*
71bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
72bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = (X&)ir;
73bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float**
74bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
75bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
76bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = (X&)fr;
7777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  _Complex float cf;
7877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  _Complex float &cfr = cf;
7977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load i32**
8077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast i32*
8177d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
8277d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
8377d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = (_Complex float&)ir;
8477d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float**
8577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast float*
8677d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
8777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
8877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = (_Complex float&)fr;
8977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast
9077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
9177d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
9277d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = (_Complex float&)xr;
93bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: ret void
94bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor}
95bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
9693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z15functional_castRiRfR1X
97bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregorvoid functional_cast(int &ir, float &fr, X &xr) {
98bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  typedef int &intref;
99bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  typedef float &floatref;
100bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  typedef X &Xref;
101bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float**
102bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
103bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32*
104bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = intref(fr);
105bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
106bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to i32\*}}
107bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32*
108bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = intref(xr);
109bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32
110bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
111bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float*
112bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = floatref(ir);
113bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
114bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
115bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float*
116bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = floatref(xr);
117bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32**
118bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast i32*
119bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
120bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = Xref(ir);
121bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load float**
122bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
123bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
124bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = Xref(fr);
12577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  typedef _Complex float &complex_float_ref;
12677d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  _Complex float cf;
12777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  _Complex float &cfr = cf;
12877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load i32**
12977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast i32*
13077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
13177d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
13277d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = complex_float_ref(ir);
13377d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float**
13477d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast float*
13577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
13677d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
13777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = complex_float_ref(fr);
13877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast
13977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
14077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: load float*
14177d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = complex_float_ref(xr);
142bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: ret void
143bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor}
144bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
145bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregornamespace PR6437 {
146bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  struct in_addr {};
147bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  void copy( const struct in_addr &new_addr ) {
148bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor    int addr = (int&)new_addr;
149bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  }
150bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor}
151bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
152bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregornamespace PR7593 {
153bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  void foo(double &X, char *A) {
154bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor    X = reinterpret_cast<double&>(A[4]);
155bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  }
156bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor}
157bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor
158bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregornamespace PR7344 {
159bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  void serialize_annotatable_id( void*& id )
160bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  {
161bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor    unsigned long l_id = (unsigned long&)id;
162bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  }
163bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor}
164