diff options
| author | Oliver Schneider <github35764891676564198441@oli-obk.de> | 2018-05-24 11:03:33 +0200 |
|---|---|---|
| committer | Oliver Schneider <github35764891676564198441@oli-obk.de> | 2018-05-24 20:49:38 +0200 |
| commit | c6d25dc22456fceebf2ef3389c34c5c5795e00c3 (patch) | |
| tree | 4ab241850460f1958ef6d055303be56ef5592ecf | |
| parent | 1a2964a541ddd38ac358635fa2a8adeb5926d474 (diff) | |
| download | rust-c6d25dc22456fceebf2ef3389c34c5c5795e00c3.tar.gz rust-c6d25dc22456fceebf2ef3389c34c5c5795e00c3.zip | |
Don't ICE on horrible transmutes in pattern constants
| -rw-r--r-- | src/librustc_mir/hair/pattern/mod.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/const-eval/ref_to_int_match.rs | 30 | ||||
| -rw-r--r-- | src/test/ui/const-eval/ref_to_int_match.stderr | 9 |
3 files changed, 44 insertions, 4 deletions
diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir/hair/pattern/mod.rs index 5c22462c4c7..afd61fe12bf 100644 --- a/src/librustc_mir/hair/pattern/mod.rs +++ b/src/librustc_mir/hair/pattern/mod.rs @@ -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 diff --git a/src/test/ui/const-eval/ref_to_int_match.rs b/src/test/ui/const-eval/ref_to_int_match.rs new file mode 100644 index 00000000000..e56505a7c71 --- /dev/null +++ b/src/test/ui/const-eval/ref_to_int_match.rs @@ -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 }; \ No newline at end of file diff --git a/src/test/ui/const-eval/ref_to_int_match.stderr b/src/test/ui/const-eval/ref_to_int_match.stderr new file mode 100644 index 00000000000..80053c5c9a2 --- /dev/null +++ b/src/test/ui/const-eval/ref_to_int_match.stderr @@ -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`. |
