xref: /llvm-project/clang/test/CodeGenCXX/lvalue-bitcasts.cpp (revision 2f1fb5da724cf1c4455eadf67591640f83801547)
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
reinterpret_cast_test(int & ir,float & fr,X & xr)7 void reinterpret_cast_test(int &ir, float &fr, X &xr) {
8   // CHECK: load ptr, ptr
9   // CHECK: load i32, ptr
10   ir = reinterpret_cast<int&>(fr);
11   // CHECK: load
12   // CHECK: load i32, ptr
13   ir = reinterpret_cast<int&>(xr);
14   // CHECK: load ptr
15   // CHECK: load float, ptr
16   fr = reinterpret_cast<float&>(ir);
17   // CHECK: load
18   // CHECK: load float, ptr
19   fr = reinterpret_cast<float&>(xr);
20   // CHECK: load ptr, ptr
21   // CHECK: call void @llvm.memcpy.p0.p0.i64
22   xr = reinterpret_cast<X&>(ir);
23   // CHECK: load ptr, ptr
24   // CHECK: call void @llvm.memcpy.p0.p0.i64
25   xr = reinterpret_cast<X&>(fr);
26   _Complex float cf;
27   _Complex float &cfr = cf;
28   // CHECK: load ptr, ptr
29   // CHECK: load float, ptr
30   // CHECK: load float, ptr
31   cfr = reinterpret_cast<_Complex float&>(ir);
32   // CHECK: load ptr, ptr
33   // CHECK: load float, ptr
34   // CHECK: load float, ptr
35   cfr = reinterpret_cast<_Complex float&>(fr);
36   // CHECK: load float, ptr
37   // CHECK: load float, ptr
38   cfr = reinterpret_cast<_Complex float&>(xr);
39   // CHECK: ret void
40 }
41 
42 // CHECK-LABEL: define{{.*}} void @_Z6c_castRiRfR1X
c_cast(int & ir,float & fr,X & xr)43 void c_cast(int &ir, float &fr, X &xr) {
44   // CHECK: load ptr, ptr
45   // CHECK: load i32, ptr
46   ir = (int&)fr;
47   // CHECK: load
48   // CHECK: load i32, ptr
49   ir = (int&)xr;
50   // CHECK: load ptr
51   // CHECK: load float, ptr
52   fr = (float&)ir;
53   // CHECK: load
54   // CHECK: load float, ptr
55   fr = (float&)xr;
56   // CHECK: load ptr, ptr
57   // CHECK: call void @llvm.memcpy.p0.p0.i64
58   xr = (X&)ir;
59   // CHECK: load ptr, ptr
60   // CHECK: call void @llvm.memcpy.p0.p0.i64
61   xr = (X&)fr;
62   _Complex float cf;
63   _Complex float &cfr = cf;
64   // CHECK: load ptr, ptr
65   // CHECK: load float, ptr
66   // CHECK: load float, ptr
67   cfr = (_Complex float&)ir;
68   // CHECK: load ptr, ptr
69   // CHECK: load float, ptr
70   // CHECK: load float, ptr
71   cfr = (_Complex float&)fr;
72   // CHECK: load float, ptr
73   // CHECK: load float, ptr
74   cfr = (_Complex float&)xr;
75   // CHECK: ret void
76 }
77 
78 // CHECK-LABEL: define{{.*}} void @_Z15functional_castRiRfR1X
functional_cast(int & ir,float & fr,X & xr)79 void functional_cast(int &ir, float &fr, X &xr) {
80   typedef int &intref;
81   typedef float &floatref;
82   typedef X &Xref;
83   // CHECK: load ptr, ptr
84   // CHECK: load i32, ptr
85   ir = intref(fr);
86   // CHECK: load
87   // CHECK: load i32, ptr
88   ir = intref(xr);
89   // CHECK: load ptr
90   // CHECK: load float, ptr
91   fr = floatref(ir);
92   // CHECK: load
93   // CHECK: load float, ptr
94   fr = floatref(xr);
95   // CHECK: load ptr, ptr
96   // CHECK: call void @llvm.memcpy.p0.p0.i64
97   xr = Xref(ir);
98   // CHECK: load ptr, ptr
99   // CHECK: call void @llvm.memcpy.p0.p0.i64
100   xr = Xref(fr);
101   typedef _Complex float &complex_float_ref;
102   _Complex float cf;
103   _Complex float &cfr = cf;
104   // CHECK: load ptr, ptr
105   // CHECK: load float, ptr
106   // CHECK: load float, ptr
107   cfr = complex_float_ref(ir);
108   // CHECK: load ptr, ptr
109   // CHECK: load float, ptr
110   // CHECK: load float, ptr
111   cfr = complex_float_ref(fr);
112   // CHECK: load float, ptr
113   // CHECK: load float, ptr
114   cfr = complex_float_ref(xr);
115   // CHECK: ret void
116 }
117 
118 namespace PR6437 {
119   struct in_addr {};
copy(const struct in_addr & new_addr)120   void copy( const struct in_addr &new_addr ) {
121     int addr = (int&)new_addr;
122   }
123 }
124 
125 namespace PR7593 {
foo(double & X,char * A)126   void foo(double &X, char *A) {
127     X = reinterpret_cast<double&>(A[4]);
128   }
129 }
130 
131 namespace PR7344 {
serialize_annotatable_id(void * & id)132   void serialize_annotatable_id( void*& id )
133   {
134     unsigned long l_id = (unsigned long&)id;
135   }
136 }
137