about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <github35764891676564198441@oli-obk.de>2018-05-24 11:03:33 +0200
committerOliver Schneider <github35764891676564198441@oli-obk.de>2018-05-24 20:49:38 +0200
commitc6d25dc22456fceebf2ef3389c34c5c5795e00c3 (patch)
tree4ab241850460f1958ef6d055303be56ef5592ecf
parent1a2964a541ddd38ac358635fa2a8adeb5926d474 (diff)
downloadrust-c6d25dc22456fceebf2ef3389c34c5c5795e00c3.tar.gz
rust-c6d25dc22456fceebf2ef3389c34c5c5795e00c3.zip
Don't ICE on horrible transmutes in pattern constants
-rw-r--r--src/librustc_mir/hair/pattern/mod.rs9
-rw-r--r--src/test/ui/const-eval/ref_to_int_match.rs30
-rw-r--r--src/test/ui/const-eval/ref_to_int_match.stderr9
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`.