@@ -6,6 +6,7 @@ use rustc_const_eval::EvalHint::ExprTypeChecked;
6
6
use rustc_const_eval:: ConstContext ;
7
7
use rustc_const_math:: ConstInt ;
8
8
use std:: cmp:: Ordering ;
9
+ use std:: collections:: Bound ;
9
10
use syntax:: ast:: LitKind ;
10
11
use syntax:: codemap:: Span ;
11
12
use utils:: paths;
@@ -361,18 +362,22 @@ fn all_ranges(cx: &LateContext, arms: &[Arm]) -> Vec<SpannedRange<ConstVal>> {
361
362
}
362
363
. filter_map ( |pat| {
363
364
if_let_chain ! { [
364
- let PatKind :: Range ( ref lhs, ref rhs, _ ) = pat. node,
365
+ let PatKind :: Range ( ref lhs, ref rhs, ref range_end ) = pat. node,
365
366
let Ok ( lhs) = constcx. eval( lhs, ExprTypeChecked ) ,
366
367
let Ok ( rhs) = constcx. eval( rhs, ExprTypeChecked )
367
368
] , {
369
+ let rhs = match * range_end {
370
+ RangeEnd :: Included => Bound :: Included ( rhs) ,
371
+ RangeEnd :: Excluded => Bound :: Excluded ( rhs) ,
372
+ } ;
368
373
return Some ( SpannedRange { span: pat. span, node: ( lhs, rhs) } ) ;
369
374
} }
370
375
371
376
if_let_chain ! { [
372
377
let PatKind :: Lit ( ref value) = pat. node,
373
378
let Ok ( value) = constcx. eval( value, ExprTypeChecked )
374
379
] , {
375
- return Some ( SpannedRange { span: pat. span, node: ( value. clone( ) , value) } ) ;
380
+ return Some ( SpannedRange { span: pat. span, node: ( value. clone( ) , Bound :: Included ( value) ) } ) ;
376
381
} }
377
382
378
383
None
@@ -384,7 +389,7 @@ fn all_ranges(cx: &LateContext, arms: &[Arm]) -> Vec<SpannedRange<ConstVal>> {
384
389
#[ derive( Debug , Eq , PartialEq ) ]
385
390
pub struct SpannedRange < T > {
386
391
pub span : Span ,
387
- pub node : ( T , T ) ,
392
+ pub node : ( T , Bound < T > ) ,
388
393
}
389
394
390
395
type TypedRanges = Vec < SpannedRange < ConstInt > > ;
@@ -393,13 +398,20 @@ type TypedRanges = Vec<SpannedRange<ConstInt>>;
393
398
/// `Uint` and `Int` probably don't make sense.
394
399
fn type_ranges ( ranges : & [ SpannedRange < ConstVal > ] ) -> TypedRanges {
395
400
ranges. iter ( )
396
- . filter_map ( |range| if let ( ConstVal :: Integral ( start ) , ConstVal :: Integral ( end ) ) = range. node {
397
- Some ( SpannedRange {
401
+ . filter_map ( |range| match range. node {
402
+ ( ConstVal :: Integral ( start ) , Bound :: Included ( ConstVal :: Integral ( end ) ) ) => Some ( SpannedRange {
398
403
span : range. span ,
399
- node : ( start, end) ,
400
- } )
401
- } else {
402
- None
404
+ node : ( start, Bound :: Included ( end) ) ,
405
+ } ) ,
406
+ ( ConstVal :: Integral ( start) , Bound :: Excluded ( ConstVal :: Integral ( end) ) ) => Some ( SpannedRange {
407
+ span : range. span ,
408
+ node : ( start, Bound :: Excluded ( end) ) ,
409
+ } ) ,
410
+ ( ConstVal :: Integral ( start) , Bound :: Unbounded ) => Some ( SpannedRange {
411
+ span : range. span ,
412
+ node : ( start, Bound :: Unbounded ) ,
413
+ } ) ,
414
+ _ => None ,
403
415
} )
404
416
. collect ( )
405
417
}
@@ -443,7 +455,7 @@ pub fn overlapping<T>(ranges: &[SpannedRange<T>]) -> Option<(&SpannedRange<T>, &
443
455
#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
444
456
enum Kind < ' a , T : ' a > {
445
457
Start ( T , & ' a SpannedRange < T > ) ,
446
- End ( T , & ' a SpannedRange < T > ) ,
458
+ End ( Bound < T > , & ' a SpannedRange < T > ) ,
447
459
}
448
460
449
461
impl < ' a , T : Copy > Kind < ' a , T > {
@@ -454,9 +466,9 @@ pub fn overlapping<T>(ranges: &[SpannedRange<T>]) -> Option<(&SpannedRange<T>, &
454
466
}
455
467
}
456
468
457
- fn value ( self ) -> T {
469
+ fn value ( self ) -> Bound < T > {
458
470
match self {
459
- Kind :: Start ( t, _) |
471
+ Kind :: Start ( t, _) => Bound :: Included ( t ) ,
460
472
Kind :: End ( t, _) => t,
461
473
}
462
474
}
@@ -470,7 +482,20 @@ pub fn overlapping<T>(ranges: &[SpannedRange<T>]) -> Option<(&SpannedRange<T>, &
470
482
471
483
impl < ' a , T : Copy + Ord > Ord for Kind < ' a , T > {
472
484
fn cmp ( & self , other : & Self ) -> Ordering {
473
- self . value ( ) . cmp ( & other. value ( ) )
485
+ match ( self . value ( ) , other. value ( ) ) {
486
+ ( Bound :: Included ( a) , Bound :: Included ( b) ) |
487
+ ( Bound :: Excluded ( a) , Bound :: Excluded ( b) ) => a. cmp ( & b) ,
488
+ ( Bound :: Unbounded , _) |
489
+ ( _, Bound :: Unbounded ) => unimplemented ! ( ) ,
490
+ ( Bound :: Included ( a) , Bound :: Excluded ( b) ) => match a. cmp ( & b) {
491
+ Ordering :: Equal => Ordering :: Greater ,
492
+ other => other,
493
+ } ,
494
+ ( Bound :: Excluded ( a) , Bound :: Included ( b) ) => match a. cmp ( & b) {
495
+ Ordering :: Equal => Ordering :: Less ,
496
+ other => other,
497
+ } ,
498
+ }
474
499
}
475
500
}
476
501
@@ -490,7 +515,7 @@ pub fn overlapping<T>(ranges: &[SpannedRange<T>]) -> Option<(&SpannedRange<T>, &
490
515
return Some ( ( ra, rb) ) ;
491
516
}
492
517
} ,
493
- ( & Kind :: End ( a, _) , & Kind :: Start ( b, _) ) if a != b => ( ) ,
518
+ ( & Kind :: End ( a, _) , & Kind :: Start ( b, _) ) if a != Bound :: Included ( b ) => ( ) ,
494
519
_ => return Some ( ( a. range ( ) , b. range ( ) ) ) ,
495
520
}
496
521
}
0 commit comments