Don't ICE on horrible transmutes in pattern constants

This commit is contained in:
Oliver Schneider 2018-05-24 11:03:33 +02:00
parent 1a2964a541
commit c6d25dc224
3 changed files with 44 additions and 4 deletions

View File

@ -364,9 +364,9 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> {
lo,
hi,
self.param_env.and(ty),
).unwrap();
);
match (end, cmp) {
(RangeEnd::Excluded, Ordering::Less) =>
(RangeEnd::Excluded, Some(Ordering::Less)) =>
PatternKind::Range { lo, hi, end },
(RangeEnd::Excluded, _) => {
span_err!(
@ -377,7 +377,8 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> {
);
PatternKind::Wild
},
(RangeEnd::Included, Ordering::Greater) => {
(RangeEnd::Included, None) |
(RangeEnd::Included, Some(Ordering::Greater)) => {
let mut err = struct_span_err!(
self.tcx.sess,
lo_expr.span,
@ -398,7 +399,7 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> {
err.emit();
PatternKind::Wild
},
(RangeEnd::Included, _) => PatternKind::Range { lo, hi, end },
(RangeEnd::Included, Some(_)) => PatternKind::Range { lo, hi, end },
}
}
_ => PatternKind::Wild

View File

@ -0,0 +1,30 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn main() {
match 40u64 {
0...10 => {},
10...BAR => {}, //~ ERROR lower range bound must be less than or equal to upper
_ => {},
}
}
union Foo {
f: Int,
r: &'static u32,
}
#[cfg(target_pointer_width="64")]
type Int = u64;
#[cfg(target_pointer_width="32")]
type Int = u32;
const BAR: Int = unsafe { Foo { r: &42 }.f };

View File

@ -0,0 +1,9 @@
error[E0030]: lower range bound must be less than or equal to upper
--> $DIR/ref_to_int_match.rs:14:9
|
LL | 10...BAR => {}, //~ ERROR lower range bound must be less than or equal to upper
| ^^ lower bound larger than upper bound
error: aborting due to previous error
For more information about this error, try `rustc --explain E0030`.