about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <github35764891676564198441@oli-obk.de>2018-05-17 12:07:00 +0200
committerOliver Schneider <github35764891676564198441@oli-obk.de>2018-05-19 13:10:51 +0200
commitd81651e8e9af5c8c40a4bd9b6b7becf12486bdad (patch)
tree9e645a6f5644a4884aa5590270c94f504af0263c
parentbdace29de04af4fe9e4317b73c3f7d6418a33de1 (diff)
downloadrust-d81651e8e9af5c8c40a4bd9b6b7becf12486bdad.tar.gz
rust-d81651e8e9af5c8c40a4bd9b6b7becf12486bdad.zip
Release mode overflows should not cause const eval to error
-rw-r--r--src/librustc_mir/interpret/eval_context.rs12
-rw-r--r--src/test/run-fail/promoted_div_by_zero.rs17
-rw-r--r--src/test/run-fail/promoted_overflow.rs17
-rw-r--r--src/test/run-pass/promoted_overflow_opt.rs18
-rw-r--r--src/test/ui/const-eval/promoted_errors.rs2
-rw-r--r--src/test/ui/const-eval/promoted_errors.stderr28
6 files changed, 62 insertions, 32 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index 03137619eda..067f9ce0248 100644
--- a/src/librustc_mir/interpret/eval_context.rs
+++ b/src/librustc_mir/interpret/eval_context.rs
@@ -522,21 +522,13 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
             BinaryOp(bin_op, ref left, ref right) => {
                 let left = self.eval_operand(left)?;
                 let right = self.eval_operand(right)?;
-                if self.intrinsic_overflowing(
+                self.intrinsic_overflowing(
                     bin_op,
                     left,
                     right,
                     dest,
                     dest_ty,
-                )?
-                {
-                    // There was an overflow in an unchecked binop.  Right now, we consider this an error and bail out.
-                    // The rationale is that the reason rustc emits unchecked binops in release mode (vs. the checked binops
-                    // it emits in debug mode) is performance, but it doesn't cost us any performance in miri.
-                    // If, however, the compiler ever starts transforming unchecked intrinsics into unchecked binops,
-                    // we have to go back to just ignoring the overflow here.
-                    return err!(Overflow(bin_op));
-                }
+                )?;
             }
 
             CheckedBinaryOp(bin_op, ref left, ref right) => {
diff --git a/src/test/run-fail/promoted_div_by_zero.rs b/src/test/run-fail/promoted_div_by_zero.rs
new file mode 100644
index 00000000000..385fd509232
--- /dev/null
+++ b/src/test/run-fail/promoted_div_by_zero.rs
@@ -0,0 +1,17 @@
+// Copyright 2018 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.
+
+#![allow(const_err)]
+
+// error-pattern: attempt to divide by zero
+
+fn main() {
+    let x = &(1 / (1 - 1));
+}
diff --git a/src/test/run-fail/promoted_overflow.rs b/src/test/run-fail/promoted_overflow.rs
new file mode 100644
index 00000000000..5169dcbf5f4
--- /dev/null
+++ b/src/test/run-fail/promoted_overflow.rs
@@ -0,0 +1,17 @@
+// Copyright 2018 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.
+
+#![allow(const_err)]
+
+// error-pattern: overflow
+
+fn main() {
+    let x: &'static u32 = &(0u32 - 1);
+}
diff --git a/src/test/run-pass/promoted_overflow_opt.rs b/src/test/run-pass/promoted_overflow_opt.rs
new file mode 100644
index 00000000000..6b2f1c6d3c8
--- /dev/null
+++ b/src/test/run-pass/promoted_overflow_opt.rs
@@ -0,0 +1,18 @@
+// Copyright 2018 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.
+
+#![allow(const_err)]
+
+// compile-flags: -O
+
+fn main() {
+    let x = &(0u32 - 1);
+    assert_eq!(*x, u32::max_value())
+}
diff --git a/src/test/ui/const-eval/promoted_errors.rs b/src/test/ui/const-eval/promoted_errors.rs
index 7385860abae..a39afb9bdd4 100644
--- a/src/test/ui/const-eval/promoted_errors.rs
+++ b/src/test/ui/const-eval/promoted_errors.rs
@@ -14,8 +14,6 @@
 // compile-flags: -O
 fn main() {
     println!("{}", 0u32 - 1);
-    //~^ WARN const_err
-    //~| WARN const_err
     let _x = 0u32 - 1;
     //~^ WARN const_err
     println!("{}", 1/(1-1));
diff --git a/src/test/ui/const-eval/promoted_errors.stderr b/src/test/ui/const-eval/promoted_errors.stderr
index 8e9a0ea43a4..683ee5375fb 100644
--- a/src/test/ui/const-eval/promoted_errors.stderr
+++ b/src/test/ui/const-eval/promoted_errors.stderr
@@ -1,8 +1,8 @@
 warning: constant evaluation error
-  --> $DIR/promoted_errors.rs:16:20
+  --> $DIR/promoted_errors.rs:17:14
    |
-LL |     println!("{}", 0u32 - 1);
-   |                    ^^^^^^^^ attempt to subtract with overflow
+LL |     let _x = 0u32 - 1;
+   |              ^^^^^^^^ attempt to subtract with overflow
    |
 note: lint level defined here
   --> $DIR/promoted_errors.rs:11:9
@@ -10,44 +10,32 @@ note: lint level defined here
 LL | #![warn(const_err)]
    |         ^^^^^^^^^
 
-warning: constant evaluation error
-  --> $DIR/promoted_errors.rs:16:20
-   |
-LL |     println!("{}", 0u32 - 1);
-   |                    ^^^^^^^^ attempt to subtract with overflow
-
-warning: constant evaluation error
-  --> $DIR/promoted_errors.rs:19:14
-   |
-LL |     let _x = 0u32 - 1;
-   |              ^^^^^^^^ attempt to subtract with overflow
-
 warning: attempt to divide by zero
-  --> $DIR/promoted_errors.rs:21:20
+  --> $DIR/promoted_errors.rs:19:20
    |
 LL |     println!("{}", 1/(1-1));
    |                    ^^^^^^^
 
 warning: constant evaluation error
-  --> $DIR/promoted_errors.rs:21:20
+  --> $DIR/promoted_errors.rs:19:20
    |
 LL |     println!("{}", 1/(1-1));
    |                    ^^^^^^^ attempt to divide by zero
 
 warning: attempt to divide by zero
-  --> $DIR/promoted_errors.rs:24:14
+  --> $DIR/promoted_errors.rs:22:14
    |
 LL |     let _x = 1/(1-1);
    |              ^^^^^^^
 
 warning: constant evaluation error
-  --> $DIR/promoted_errors.rs:24:14
+  --> $DIR/promoted_errors.rs:22:14
    |
 LL |     let _x = 1/(1-1);
    |              ^^^^^^^ attempt to divide by zero
 
 warning: constant evaluation error
-  --> $DIR/promoted_errors.rs:27:20
+  --> $DIR/promoted_errors.rs:25:20
    |
 LL |     println!("{}", 1/(false as u32));
    |                    ^^^^^^^^^^^^^^^^ attempt to divide by zero