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