@@ -105,14 +105,31 @@ macro_rules! array_ref {
105
105
macro_rules! array_refs {
106
106
( $arr: expr, $( $pre: expr ) ,* ; .. ; $( $post: expr ) ,* ) => { {
107
107
{
108
+ /// A hokey struct to avoid theoretical overflow, which is only used
109
+ /// at compile time, so efficiency of the overflow checks are not of
110
+ /// concern.
111
+ struct SaturatingUsize ( usize ) ;
112
+ impl SaturatingUsize {
113
+ // It is only used at compile time, so gets incorrectly
114
+ // triggered as "dead code".
115
+ #[ allow( dead_code) ]
116
+ const fn add( self , rhs: usize ) -> Self {
117
+ if let Some ( v) = self . 0 . checked_add( rhs) {
118
+ SaturatingUsize ( v)
119
+ } else {
120
+ SaturatingUsize ( usize :: MAX )
121
+ }
122
+ }
123
+ }
124
+
108
125
use core:: slice;
109
126
#[ inline]
110
127
#[ allow( unused_assignments) ]
111
128
#[ allow( clippy:: eval_order_dependence) ]
112
129
unsafe fn as_arrays<T >( a: & [ T ] ) -> ( $( & [ T ; $pre] , ) * & [ T ] , $( & [ T ; $post] , ) * ) {
113
- let min_len = $( $pre + ) * $( $post + ) * 0 ;
114
- let var_len = a. len( ) - min_len ;
115
- assert!( a. len( ) >= min_len ) ;
130
+ const MIN_LEN : usize = SaturatingUsize ( 0 ) $( . add ( $pre) ) * $( . add ( $post) ) * . 0 ;
131
+ let var_len = a. len( ) - MIN_LEN ;
132
+ assert!( a. len( ) >= MIN_LEN ) ;
116
133
let mut p = a. as_ptr( ) ;
117
134
( $( {
118
135
let aref = & * ( p as * const [ T ; $pre] ) ;
@@ -202,14 +219,31 @@ macro_rules! array_refs {
202
219
macro_rules! mut_array_refs {
203
220
( $arr: expr, $( $pre: expr ) ,* ; .. ; $( $post: expr ) ,* ) => { {
204
221
{
222
+ /// A hokey struct to avoid theoretical overflow, which is only used
223
+ /// at compile time, so efficiency of the overflow checks are not of
224
+ /// concern.
225
+ struct SaturatingUsize ( usize ) ;
226
+ impl SaturatingUsize {
227
+ // It is only used at compile time, so gets incorrectly
228
+ // triggered as "dead code".
229
+ #[ allow( dead_code) ]
230
+ const fn add( self , rhs: usize ) -> Self {
231
+ if let Some ( v) = self . 0 . checked_add( rhs) {
232
+ SaturatingUsize ( v)
233
+ } else {
234
+ SaturatingUsize ( usize :: MAX )
235
+ }
236
+ }
237
+ }
238
+
205
239
use core:: slice;
206
240
#[ inline]
207
241
#[ allow( unused_assignments) ]
208
242
#[ allow( clippy:: eval_order_dependence) ]
209
243
unsafe fn as_arrays<T >( a: & mut [ T ] ) -> ( $( & mut [ T ; $pre] , ) * & mut [ T ] , $( & mut [ T ; $post] , ) * ) {
210
- let min_len = $( $pre + ) * $( $post + ) * 0 ;
211
- let var_len = a. len( ) - min_len ;
212
- assert!( a. len( ) >= min_len ) ;
244
+ const MIN_LEN : usize = SaturatingUsize ( 0 ) $( . add ( $pre) ) * $( . add ( $post) ) * . 0 ;
245
+ let var_len = a. len( ) - MIN_LEN ;
246
+ assert!( a. len( ) >= MIN_LEN ) ;
213
247
let mut p = a. as_mut_ptr( ) ;
214
248
( $( {
215
249
let aref = & mut * ( p as * mut [ T ; $pre] ) ;
0 commit comments