xref: /llvm-project/clang/test/CodeGenCXX/lvalue-bitcasts.cpp (revision c95a41b510824a8f24f9ba359ba78ff203dfabc0)
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: 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   // CHECK: ret void
33 }
34 
35 // CHECK: define void @_Z6c_castRiRfR1X
36 void c_cast(int &ir, float &fr, X &xr) {
37   // CHECK: load float**
38   // CHECK: bitcast float*
39   // CHECK: load i32*
40   ir = (int&)fr;
41   // CHECK: load
42   // CHECK: {{bitcast.*to i32\*}}
43   // CHECK: load i32*
44   ir = (int&)xr;
45   // CHECK: load i32
46   // CHECK: {{bitcast.*to float\*}}
47   // CHECK: load float*
48   fr = (float&)ir;
49   // CHECK: load
50   // CHECK: {{bitcast.*to float\*}}
51   // CHECK: load float*
52   fr = (float&)xr;
53   // CHECK: load i32**
54   // CHECK: bitcast i32*
55   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
56   xr = (X&)ir;
57   // CHECK: load float**
58   // CHECK: bitcast float*
59   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
60   xr = (X&)fr;
61   // CHECK: ret void
62 }
63 
64 // CHECK: define void @_Z15functional_castRiRfR1X
65 void functional_cast(int &ir, float &fr, X &xr) {
66   typedef int &intref;
67   typedef float &floatref;
68   typedef X &Xref;
69   // CHECK: load float**
70   // CHECK: bitcast float*
71   // CHECK: load i32*
72   ir = intref(fr);
73   // CHECK: load
74   // CHECK: {{bitcast.*to i32\*}}
75   // CHECK: load i32*
76   ir = intref(xr);
77   // CHECK: load i32
78   // CHECK: {{bitcast.*to float\*}}
79   // CHECK: load float*
80   fr = floatref(ir);
81   // CHECK: load
82   // CHECK: {{bitcast.*to float\*}}
83   // CHECK: load float*
84   fr = floatref(xr);
85   // CHECK: load i32**
86   // CHECK: bitcast i32*
87   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
88   xr = Xref(ir);
89   // CHECK: load float**
90   // CHECK: bitcast float*
91   // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
92   xr = Xref(fr);
93   // CHECK: ret void
94 }
95 
96 namespace PR6437 {
97   struct in_addr {};
98   void copy( const struct in_addr &new_addr ) {
99     int addr = (int&)new_addr;
100   }
101 }
102 
103 namespace PR7593 {
104   void foo(double &X, char *A) {
105     X = reinterpret_cast<double&>(A[4]);
106   }
107 }
108 
109 namespace PR7344 {
110   void serialize_annotatable_id( void*& id )
111   {
112     unsigned long l_id = (unsigned long&)id;
113   }
114 }
115