blob: 5b95b24531c8ca32c60806f7fb73b2affbc0f8f7 [file] [log] [blame]
Douglas Gregorbc25f192010-07-13 23:27:15 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
2
3struct X { int i; float f; };
4struct Y { X x; };
5
6// CHECK: define void @_Z21reinterpret_cast_testRiRfR1X
7void 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
36void 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
65void 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
96namespace PR6437 {
97 struct in_addr {};
98 void copy( const struct in_addr &new_addr ) {
99 int addr = (int&)new_addr;
100 }
101}
102
103namespace PR7593 {
104 void foo(double &X, char *A) {
105 X = reinterpret_cast<double&>(A[4]);
106 }
107}
108
109namespace PR7344 {
110 void serialize_annotatable_id( void*& id )
111 {
112 unsigned long l_id = (unsigned long&)id;
113 }
114}