]>
Commit | Line | Data |
---|---|---|
f2b60f7d | 1 | // unit-test: LowerIntrinsics |
fe692bf9 | 2 | // EMIT_MIR_FOR_EACH_PANIC_STRATEGY |
f2b60f7d | 3 | |
353b0b11 | 4 | #![feature(core_intrinsics, intrinsics, rustc_attrs)] |
fc512014 XL |
5 | #![crate_type = "lib"] |
6 | ||
7 | // EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff | |
04454e1e | 8 | pub fn wrapping(a: i32, b: i32) { |
ed00b5ec FG |
9 | // CHECK-LABEL: fn wrapping( |
10 | // CHECK: {{_.*}} = Add( | |
11 | // CHECK: {{_.*}} = Sub( | |
12 | // CHECK: {{_.*}} = Mul( | |
fc512014 XL |
13 | let _x = core::intrinsics::wrapping_add(a, b); |
14 | let _y = core::intrinsics::wrapping_sub(a, b); | |
15 | let _z = core::intrinsics::wrapping_mul(a, b); | |
16 | } | |
17 | ||
fe692bf9 FG |
18 | // EMIT_MIR lower_intrinsics.unchecked.LowerIntrinsics.diff |
19 | pub unsafe fn unchecked(a: i32, b: i32) { | |
ed00b5ec FG |
20 | // CHECK-LABEL: fn unchecked( |
21 | // CHECK: {{_.*}} = AddUnchecked( | |
22 | // CHECK: {{_.*}} = SubUnchecked( | |
23 | // CHECK: {{_.*}} = MulUnchecked( | |
24 | // CHECK: {{_.*}} = Div( | |
25 | // CHECK: {{_.*}} = Rem( | |
26 | // CHECK: {{_.*}} = ShlUnchecked( | |
27 | // CHECK: {{_.*}} = ShrUnchecked( | |
fe692bf9 FG |
28 | let _a = core::intrinsics::unchecked_add(a, b); |
29 | let _b = core::intrinsics::unchecked_sub(a, b); | |
30 | let _c = core::intrinsics::unchecked_mul(a, b); | |
31 | let _x = core::intrinsics::unchecked_div(a, b); | |
32 | let _y = core::intrinsics::unchecked_rem(a, b); | |
33 | let _i = core::intrinsics::unchecked_shl(a, b); | |
34 | let _j = core::intrinsics::unchecked_shr(a, b); | |
35 | } | |
36 | ||
fc512014 XL |
37 | // EMIT_MIR lower_intrinsics.size_of.LowerIntrinsics.diff |
38 | pub fn size_of<T>() -> usize { | |
ed00b5ec FG |
39 | // CHECK-LABEL: fn size_of( |
40 | // CHECK: {{_.*}} = SizeOf(T); | |
fc512014 XL |
41 | core::intrinsics::size_of::<T>() |
42 | } | |
43 | ||
c295e0f8 XL |
44 | // EMIT_MIR lower_intrinsics.align_of.LowerIntrinsics.diff |
45 | pub fn align_of<T>() -> usize { | |
ed00b5ec FG |
46 | // CHECK-LABEL: fn align_of( |
47 | // CHECK: {{_.*}} = AlignOf(T); | |
c295e0f8 XL |
48 | core::intrinsics::min_align_of::<T>() |
49 | } | |
50 | ||
fc512014 XL |
51 | // EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff |
52 | pub fn forget<T>(t: T) { | |
ed00b5ec FG |
53 | // CHECK-LABEL: fn forget( |
54 | // CHECK-NOT: Drop( | |
55 | // CHECK: return; | |
56 | // CHECK-NOT: Drop( | |
5869c6ff | 57 | core::intrinsics::forget(t) |
fc512014 XL |
58 | } |
59 | ||
60 | // EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff | |
61 | pub fn unreachable() -> ! { | |
ed00b5ec FG |
62 | // CHECK-LABEL: fn unreachable( |
63 | // CHECK: unreachable; | |
fc512014 XL |
64 | unsafe { core::intrinsics::unreachable() }; |
65 | } | |
66 | ||
fc512014 XL |
67 | // EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff |
68 | pub fn non_const<T>() -> usize { | |
ed00b5ec FG |
69 | // CHECK-LABEL: fn non_const( |
70 | // CHECK: SizeOf(T); | |
71 | ||
fc512014 XL |
72 | // Check that lowering works with non-const operand as a func. |
73 | let size_of_t = core::intrinsics::size_of::<T>; | |
74 | size_of_t() | |
75 | } | |
76 | ||
353b0b11 FG |
77 | // EMIT_MIR lower_intrinsics.transmute_inhabited.LowerIntrinsics.diff |
78 | pub fn transmute_inhabited(c: std::cmp::Ordering) -> i8 { | |
ed00b5ec FG |
79 | // CHECK-LABEL: fn transmute_inhabited( |
80 | // CHECK: {{_.*}} = {{.*}} as i8 (Transmute); | |
81 | ||
353b0b11 FG |
82 | unsafe { std::mem::transmute(c) } |
83 | } | |
84 | ||
85 | // EMIT_MIR lower_intrinsics.transmute_uninhabited.LowerIntrinsics.diff | |
86 | pub unsafe fn transmute_uninhabited(u: ()) -> Never { | |
ed00b5ec FG |
87 | // CHECK-LABEL: fn transmute_uninhabited( |
88 | // CHECK: {{_.*}} = {{.*}} as Never (Transmute); | |
89 | // CHECK: unreachable; | |
90 | ||
353b0b11 FG |
91 | unsafe { std::mem::transmute::<(), Never>(u) } |
92 | } | |
93 | ||
94 | // EMIT_MIR lower_intrinsics.transmute_ref_dst.LowerIntrinsics.diff | |
95 | pub unsafe fn transmute_ref_dst<T: ?Sized>(u: &T) -> *const T { | |
ed00b5ec FG |
96 | // CHECK-LABEL: fn transmute_ref_dst( |
97 | // CHECK: {{_.*}} = {{.*}} as *const T (Transmute); | |
98 | ||
353b0b11 FG |
99 | unsafe { std::mem::transmute(u) } |
100 | } | |
101 | ||
102 | // EMIT_MIR lower_intrinsics.transmute_to_ref_uninhabited.LowerIntrinsics.diff | |
103 | pub unsafe fn transmute_to_ref_uninhabited() -> ! { | |
ed00b5ec FG |
104 | // CHECK-LABEL: fn transmute_to_ref_uninhabited( |
105 | // CHECK: {{_.*}} = {{.*}} as &Never (Transmute); | |
106 | // CHECK: unreachable; | |
107 | ||
353b0b11 FG |
108 | let x: &Never = std::mem::transmute(1usize); |
109 | match *x {} | |
110 | } | |
111 | ||
112 | // EMIT_MIR lower_intrinsics.transmute_to_mut_uninhabited.LowerIntrinsics.diff | |
113 | pub unsafe fn transmute_to_mut_uninhabited() -> ! { | |
ed00b5ec FG |
114 | // CHECK-LABEL: fn transmute_to_mut_uninhabited( |
115 | // CHECK: {{_.*}} = {{.*}} as &mut Never (Transmute); | |
116 | // CHECK: unreachable; | |
117 | ||
353b0b11 FG |
118 | let x: &mut Never = std::mem::transmute(1usize); |
119 | match *x {} | |
120 | } | |
121 | ||
122 | // EMIT_MIR lower_intrinsics.transmute_to_box_uninhabited.LowerIntrinsics.diff | |
123 | pub unsafe fn transmute_to_box_uninhabited() -> ! { | |
ed00b5ec FG |
124 | // CHECK-LABEL: fn transmute_to_box_uninhabited( |
125 | // CHECK: {{_.*}} = {{.*}} as std::boxed::Box<Never> (Transmute); | |
126 | // CHECK: unreachable; | |
127 | ||
353b0b11 FG |
128 | let x: Box<Never> = std::mem::transmute(1usize); |
129 | match *x {} | |
130 | } | |
131 | ||
fc512014 XL |
132 | pub enum E { |
133 | A, | |
134 | B, | |
135 | C, | |
136 | } | |
137 | ||
138 | // EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff | |
139 | pub fn discriminant<T>(t: T) { | |
ed00b5ec FG |
140 | // CHECK-LABEL: fn discriminant( |
141 | // CHECK: {{_.*}} = discriminant( | |
142 | // CHECK: {{_.*}} = discriminant( | |
143 | // CHECK: {{_.*}} = discriminant( | |
144 | // CHECK: {{_.*}} = discriminant( | |
145 | ||
fc512014 XL |
146 | core::intrinsics::discriminant_value(&t); |
147 | core::intrinsics::discriminant_value(&0); | |
148 | core::intrinsics::discriminant_value(&()); | |
149 | core::intrinsics::discriminant_value(&E::B); | |
150 | } | |
f2b60f7d FG |
151 | |
152 | extern "rust-intrinsic" { | |
153 | // Cannot use `std::intrinsics::copy_nonoverlapping` as that is a wrapper function | |
353b0b11 | 154 | #[rustc_nounwind] |
f2b60f7d FG |
155 | fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize); |
156 | } | |
157 | ||
158 | // EMIT_MIR lower_intrinsics.f_copy_nonoverlapping.LowerIntrinsics.diff | |
159 | pub fn f_copy_nonoverlapping() { | |
ed00b5ec FG |
160 | // CHECK-LABEL: fn f_copy_nonoverlapping( |
161 | // CHECK: copy_nonoverlapping({{.*}}); | |
162 | ||
f2b60f7d FG |
163 | let src = (); |
164 | let mut dst = (); | |
165 | unsafe { | |
166 | copy_nonoverlapping(&src as *const _ as *const i32, &mut dst as *mut _ as *mut i32, 0); | |
167 | } | |
168 | } | |
169 | ||
170 | // EMIT_MIR lower_intrinsics.assume.LowerIntrinsics.diff | |
171 | pub fn assume() { | |
ed00b5ec FG |
172 | // CHECK-LABEL: fn assume( |
173 | // CHECK: assume({{.*}}); | |
174 | ||
f2b60f7d FG |
175 | unsafe { |
176 | std::intrinsics::assume(true); | |
177 | } | |
178 | } | |
9ffffee4 FG |
179 | |
180 | // EMIT_MIR lower_intrinsics.with_overflow.LowerIntrinsics.diff | |
181 | pub fn with_overflow(a: i32, b: i32) { | |
ed00b5ec FG |
182 | // CHECK-LABEL: fn with_overflow( |
183 | // CHECK: CheckedAdd( | |
184 | // CHECK: CheckedSub( | |
185 | // CHECK: CheckedMul( | |
186 | ||
9ffffee4 FG |
187 | let _x = core::intrinsics::add_with_overflow(a, b); |
188 | let _y = core::intrinsics::sub_with_overflow(a, b); | |
189 | let _z = core::intrinsics::mul_with_overflow(a, b); | |
190 | } | |
353b0b11 FG |
191 | |
192 | // EMIT_MIR lower_intrinsics.read_via_copy_primitive.LowerIntrinsics.diff | |
193 | pub fn read_via_copy_primitive(r: &i32) -> i32 { | |
ed00b5ec FG |
194 | // CHECK-LABEL: fn read_via_copy_primitive( |
195 | // CHECK: [[tmp:_.*]] = &raw const (*_1); | |
196 | // CHECK: _0 = (*[[tmp]]); | |
197 | // CHECK: return; | |
198 | ||
353b0b11 FG |
199 | unsafe { core::intrinsics::read_via_copy(r) } |
200 | } | |
201 | ||
202 | // EMIT_MIR lower_intrinsics.read_via_copy_uninhabited.LowerIntrinsics.diff | |
203 | pub fn read_via_copy_uninhabited(r: &Never) -> Never { | |
ed00b5ec FG |
204 | // CHECK-LABEL: fn read_via_copy_uninhabited( |
205 | // CHECK: [[tmp:_.*]] = &raw const (*_1); | |
206 | // CHECK: _0 = (*[[tmp]]); | |
207 | // CHECK: unreachable; | |
208 | ||
353b0b11 FG |
209 | unsafe { core::intrinsics::read_via_copy(r) } |
210 | } | |
211 | ||
49aad941 FG |
212 | // EMIT_MIR lower_intrinsics.write_via_move_string.LowerIntrinsics.diff |
213 | pub fn write_via_move_string(r: &mut String, v: String) { | |
ed00b5ec FG |
214 | // CHECK-LABEL: fn write_via_move_string( |
215 | // CHECK: [[ptr:_.*]] = &raw mut (*_1); | |
216 | // CHECK: [[tmp:_.*]] = move _2; | |
217 | // CHECK: (*[[ptr]]) = move [[tmp]]; | |
218 | // CHECK: return; | |
219 | ||
49aad941 FG |
220 | unsafe { core::intrinsics::write_via_move(r, v) } |
221 | } | |
222 | ||
353b0b11 FG |
223 | pub enum Never {} |
224 | ||
49aad941 FG |
225 | // EMIT_MIR lower_intrinsics.ptr_offset.LowerIntrinsics.diff |
226 | pub unsafe fn ptr_offset(p: *const i32, d: isize) -> *const i32 { | |
ed00b5ec FG |
227 | // CHECK-LABEL: fn ptr_offset( |
228 | // CHECK: _0 = Offset( | |
229 | ||
49aad941 FG |
230 | core::intrinsics::offset(p, d) |
231 | } |