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) {
83ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, float**
9bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32, i32*
11bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = reinterpret_cast<int&>(fr);
12bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
13bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to i32\*}}
143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32, i32*
15bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = reinterpret_cast<int&>(xr);
16bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32
17bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
19bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = reinterpret_cast<float&>(ir);
20bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
21bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
23bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = reinterpret_cast<float&>(xr);
243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32*, i32**
25bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast i32*
26bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
27bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = reinterpret_cast<X&>(ir);
283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, 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;
343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32*, i32**
3577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast i32*
363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
3877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = reinterpret_cast<_Complex float&>(ir);
393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, float**
4077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast float*
413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
4377d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = reinterpret_cast<_Complex float&>(fr);
4477d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast
453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, 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) {
533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, float**
54bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32, i32*
56bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = (int&)fr;
57bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
58bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to i32\*}}
593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32, i32*
60bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = (int&)xr;
61bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32
62bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
64bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = (float&)ir;
65bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
66bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
68bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = (float&)xr;
693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32*, i32**
70bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast i32*
71bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
72bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = (X&)ir;
733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, 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;
793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32*, i32**
8077d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast i32*
813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
8377d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = (_Complex float&)ir;
843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, float**
8577d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast float*
863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
8877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = (_Complex float&)fr;
8977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast
903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, 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;
1013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, float**
102bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast float*
1033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32, i32*
104bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = intref(fr);
105bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
106bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to i32\*}}
1073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32, i32*
108bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  ir = intref(xr);
109bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load i32
110bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
1113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
112bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = floatref(ir);
113bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: load
114bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: {{bitcast.*to float\*}}
1153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
116bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  fr = floatref(xr);
1173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32*, i32**
118bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: bitcast i32*
119bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
120bc25f19da3cff74cb0ad4f228e9beca99ed56582Douglas Gregor  xr = Xref(ir);
1213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, 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;
1283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load i32*, i32**
12977d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast i32*
1303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
1313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
13277d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = complex_float_ref(ir);
1333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float*, float**
13477d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast float*
1353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
1363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
13777d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  cfr = complex_float_ref(fr);
13877d439a4d69ffe30a7607c07b3ec5113824fd53eDouglas Gregor  // CHECK: bitcast
1393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, float*
1403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: load float, 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