Fix bug in matching on floating-point ranges
This commit is contained in:
parent
0fb52fb538
commit
4406391cdc
8 changed files with 35 additions and 56 deletions
|
@ -812,8 +812,17 @@ impl<'tcx> IntRange<'tcx> {
|
||||||
fn from_ctor(tcx: TyCtxt<'_, 'tcx, 'tcx>,
|
fn from_ctor(tcx: TyCtxt<'_, 'tcx, 'tcx>,
|
||||||
ctor: &Constructor<'tcx>)
|
ctor: &Constructor<'tcx>)
|
||||||
-> Option<IntRange<'tcx>> {
|
-> Option<IntRange<'tcx>> {
|
||||||
|
// Floating-point ranges are permitted and we don't want
|
||||||
|
// to consider them when constructing integer ranges.
|
||||||
|
fn is_integral<'tcx>(ty: Ty<'tcx>) -> bool {
|
||||||
|
match ty.sty {
|
||||||
|
ty::Char | ty::Int(_) | ty::Uint(_) => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match ctor {
|
match ctor {
|
||||||
ConstantRange(lo, hi, ty, end) => {
|
ConstantRange(lo, hi, ty, end) if is_integral(ty) => {
|
||||||
// Perform a shift if the underlying types are signed,
|
// Perform a shift if the underlying types are signed,
|
||||||
// which makes the interval arithmetic simpler.
|
// which makes the interval arithmetic simpler.
|
||||||
let bias = IntRange::signed_bias(tcx, ty);
|
let bias = IntRange::signed_bias(tcx, ty);
|
||||||
|
@ -826,7 +835,7 @@ impl<'tcx> IntRange<'tcx> {
|
||||||
Some(IntRange { range: lo..=(hi - offset), ty })
|
Some(IntRange { range: lo..=(hi - offset), ty })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ConstantValue(val) => {
|
ConstantValue(val) if is_integral(val.ty) => {
|
||||||
let ty = val.ty;
|
let ty = val.ty;
|
||||||
if let Some(val) = val.assert_bits(tcx, ty::ParamEnv::empty().and(ty)) {
|
if let Some(val) = val.assert_bits(tcx, ty::ParamEnv::empty().and(ty)) {
|
||||||
let bias = IntRange::signed_bias(tcx, ty);
|
let bias = IntRange::signed_bias(tcx, ty);
|
||||||
|
@ -836,9 +845,7 @@ impl<'tcx> IntRange<'tcx> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Single | Variant(_) | Slice(_) => {
|
_ => None,
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
warning: unreachable pattern
|
|
||||||
--> $DIR/vec-matching-autoslice.rs:31:9
|
|
||||||
|
|
|
||||||
LL | ([_, _], _) => panic!(),
|
|
||||||
| ^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: #[warn(unreachable_patterns)] on by default
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
warning: unreachable pattern
|
|
||||||
--> $DIR/match-range.rs:47:7
|
|
||||||
|
|
|
||||||
LL | _ => panic!("should match float range")
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= note: #[warn(unreachable_patterns)] on by default
|
|
||||||
|
|
||||||
warning: unreachable pattern
|
|
||||||
--> $DIR/match-range.rs:55:9
|
|
||||||
|
|
|
||||||
LL | _ => {},
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: unreachable pattern
|
|
||||||
--> $DIR/match-range.rs:59:9
|
|
||||||
|
|
|
||||||
LL | _ => panic!("should match the range start"),
|
|
||||||
| ^
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
warning: unreachable pattern
|
|
||||||
--> $DIR/issue-15881-model-lexer-dotdotdot.rs:41:7
|
|
||||||
|
|
|
||||||
LL | _ => panic!("should match float range")
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= note: #[warn(unreachable_patterns)] on by default
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
warning: unreachable pattern
|
|
||||||
--> $DIR/issue-7222.rs:20:9
|
|
||||||
|
|
|
||||||
LL | _ => ()
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= note: #[warn(unreachable_patterns)] on by default
|
|
||||||
|
|
|
@ -62,11 +62,5 @@ error: unreachable pattern
|
||||||
LL | 0.02f64 => {}
|
LL | 0.02f64 => {}
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
error: unreachable pattern
|
error: aborting due to 5 previous errors
|
||||||
--> $DIR/match-range-fail-dominate.rs:47:7
|
|
||||||
|
|
|
||||||
LL | _ => {}
|
|
||||||
| ^
|
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
#![allow(illegal_floating_point_literal_pattern)]
|
||||||
|
#![deny(unreachable_patterns)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
match 0.0 {
|
||||||
|
0.0..=1.0 => {}
|
||||||
|
_ => {} // ok
|
||||||
|
}
|
||||||
|
|
||||||
|
match 0.0 { //~ ERROR non-exhaustive patterns
|
||||||
|
0.0..=1.0 => {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0004]: non-exhaustive patterns: `_` not covered
|
||||||
|
--> $DIR/non-exhaustive-float-range-match.rs:10:11
|
||||||
|
|
|
||||||
|
LL | match 0.0 { //~ ERROR non-exhaustive patterns
|
||||||
|
| ^^^ pattern `_` not covered
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0004`.
|
Loading…
Add table
Add a link
Reference in a new issue