1
1
//! Lowers intrinsic calls
2
2
3
+ use crate :: take_array;
3
4
use rustc_middle:: mir:: * ;
4
5
use rustc_middle:: ty:: { self , TyCtxt } ;
5
6
use rustc_middle:: { bug, span_bug} ;
@@ -50,42 +51,34 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
50
51
}
51
52
sym:: copy_nonoverlapping => {
52
53
let target = target. unwrap ( ) ;
53
- let mut args = args. drain ( ..) ;
54
+ let Ok ( [ src, dst, count] ) = take_array ( args) else {
55
+ bug ! ( "Wrong arguments for copy_non_overlapping intrinsic" ) ;
56
+ } ;
54
57
block. statements . push ( Statement {
55
58
source_info : terminator. source_info ,
56
59
kind : StatementKind :: Intrinsic ( Box :: new (
57
60
NonDivergingIntrinsic :: CopyNonOverlapping (
58
61
rustc_middle:: mir:: CopyNonOverlapping {
59
- src : args . next ( ) . unwrap ( ) . node ,
60
- dst : args . next ( ) . unwrap ( ) . node ,
61
- count : args . next ( ) . unwrap ( ) . node ,
62
+ src : src . node ,
63
+ dst : dst . node ,
64
+ count : count . node ,
62
65
} ,
63
66
) ,
64
67
) ) ,
65
68
} ) ;
66
- assert_eq ! (
67
- args. next( ) ,
68
- None ,
69
- "Extra argument for copy_non_overlapping intrinsic"
70
- ) ;
71
- drop ( args) ;
72
69
terminator. kind = TerminatorKind :: Goto { target } ;
73
70
}
74
71
sym:: assume => {
75
72
let target = target. unwrap ( ) ;
76
- let mut args = args. drain ( ..) ;
73
+ let Ok ( [ arg] ) = take_array ( args) else {
74
+ bug ! ( "Wrong arguments for assume intrinsic" ) ;
75
+ } ;
77
76
block. statements . push ( Statement {
78
77
source_info : terminator. source_info ,
79
78
kind : StatementKind :: Intrinsic ( Box :: new (
80
- NonDivergingIntrinsic :: Assume ( args . next ( ) . unwrap ( ) . node ) ,
79
+ NonDivergingIntrinsic :: Assume ( arg . node ) ,
81
80
) ) ,
82
81
} ) ;
83
- assert_eq ! (
84
- args. next( ) ,
85
- None ,
86
- "Extra argument for copy_non_overlapping intrinsic"
87
- ) ;
88
- drop ( args) ;
89
82
terminator. kind = TerminatorKind :: Goto { target } ;
90
83
}
91
84
sym:: wrapping_add
@@ -100,13 +93,9 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
100
93
| sym:: unchecked_shl
101
94
| sym:: unchecked_shr => {
102
95
let target = target. unwrap ( ) ;
103
- let lhs;
104
- let rhs;
105
- {
106
- let mut args = args. drain ( ..) ;
107
- lhs = args. next ( ) . unwrap ( ) ;
108
- rhs = args. next ( ) . unwrap ( ) ;
109
- }
96
+ let Ok ( [ lhs, rhs] ) = take_array ( args) else {
97
+ bug ! ( "Wrong arguments for {} intrinsic" , intrinsic. name) ;
98
+ } ;
110
99
let bin_op = match intrinsic. name {
111
100
sym:: wrapping_add => BinOp :: Add ,
112
101
sym:: wrapping_sub => BinOp :: Sub ,
@@ -132,13 +121,9 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
132
121
}
133
122
sym:: add_with_overflow | sym:: sub_with_overflow | sym:: mul_with_overflow => {
134
123
if let Some ( target) = * target {
135
- let lhs;
136
- let rhs;
137
- {
138
- let mut args = args. drain ( ..) ;
139
- lhs = args. next ( ) . unwrap ( ) ;
140
- rhs = args. next ( ) . unwrap ( ) ;
141
- }
124
+ let Ok ( [ lhs, rhs] ) = take_array ( args) else {
125
+ bug ! ( "Wrong arguments for {} intrinsic" , intrinsic. name) ;
126
+ } ;
142
127
let bin_op = match intrinsic. name {
143
128
sym:: add_with_overflow => BinOp :: AddWithOverflow ,
144
129
sym:: sub_with_overflow => BinOp :: SubWithOverflow ,
@@ -174,7 +159,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
174
159
}
175
160
}
176
161
sym:: read_via_copy => {
177
- let [ arg] = args . as_slice ( ) else {
162
+ let Ok ( [ arg] ) = take_array ( args ) else {
178
163
span_bug ! ( terminator. source_info. span, "Wrong number of arguments" ) ;
179
164
} ;
180
165
let derefed_place = if let Some ( place) = arg. node . place ( )
@@ -207,7 +192,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
207
192
}
208
193
sym:: write_via_move => {
209
194
let target = target. unwrap ( ) ;
210
- let Ok ( [ ptr, val] ) = < [ _ ; 2 ] > :: try_from ( std :: mem :: take ( args) ) else {
195
+ let Ok ( [ ptr, val] ) = take_array ( args) else {
211
196
span_bug ! (
212
197
terminator. source_info. span,
213
198
"Wrong number of arguments for write_via_move intrinsic" ,
@@ -247,7 +232,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
247
232
}
248
233
sym:: offset => {
249
234
let target = target. unwrap ( ) ;
250
- let Ok ( [ ptr, delta] ) = < [ _ ; 2 ] > :: try_from ( std :: mem :: take ( args) ) else {
235
+ let Ok ( [ ptr, delta] ) = take_array ( args) else {
251
236
span_bug ! (
252
237
terminator. source_info. span,
253
238
"Wrong number of arguments for offset intrinsic" ,
@@ -264,7 +249,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
264
249
}
265
250
sym:: transmute | sym:: transmute_unchecked => {
266
251
let dst_ty = destination. ty ( local_decls, tcx) . ty ;
267
- let Ok ( [ arg] ) = < [ _ ; 1 ] > :: try_from ( std :: mem :: take ( args) ) else {
252
+ let Ok ( [ arg] ) = take_array ( args) else {
268
253
span_bug ! (
269
254
terminator. source_info. span,
270
255
"Wrong number of arguments for transmute intrinsic" ,
@@ -289,7 +274,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
289
274
}
290
275
}
291
276
sym:: aggregate_raw_ptr => {
292
- let Ok ( [ data, meta] ) = < [ _ ; 2 ] > :: try_from ( std :: mem :: take ( args) ) else {
277
+ let Ok ( [ data, meta] ) = take_array ( args) else {
293
278
span_bug ! (
294
279
terminator. source_info. span,
295
280
"Wrong number of arguments for aggregate_raw_ptr intrinsic" ,
@@ -317,7 +302,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
317
302
terminator. kind = TerminatorKind :: Goto { target } ;
318
303
}
319
304
sym:: ptr_metadata => {
320
- let Ok ( [ ptr] ) = < [ _ ; 1 ] > :: try_from ( std :: mem :: take ( args) ) else {
305
+ let Ok ( [ ptr] ) = take_array ( args) else {
321
306
span_bug ! (
322
307
terminator. source_info. span,
323
308
"Wrong number of arguments for ptr_metadata intrinsic" ,
0 commit comments