From c6d25dc22456fceebf2ef3389c34c5c5795e00c3 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 24 May 2018 11:03:33 +0200 Subject: [PATCH] Don't ICE on horrible transmutes in pattern constants --- src/librustc_mir/hair/pattern/mod.rs | 9 +++--- src/test/ui/const-eval/ref_to_int_match.rs | 30 +++++++++++++++++++ .../ui/const-eval/ref_to_int_match.stderr | 9 ++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/test/ui/const-eval/ref_to_int_match.rs create mode 100644 src/test/ui/const-eval/ref_to_int_match.stderr 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 or the MIT license +// , 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`.