From d81651e8e9af5c8c40a4bd9b6b7becf12486bdad Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 17 May 2018 12:07:00 +0200 Subject: [PATCH] Release mode overflows should not cause const eval to error --- src/librustc_mir/interpret/eval_context.rs | 12 ++------ src/test/run-fail/promoted_div_by_zero.rs | 17 +++++++++++ src/test/run-fail/promoted_overflow.rs | 17 +++++++++++ src/test/run-pass/promoted_overflow_opt.rs | 18 ++++++++++++ src/test/ui/const-eval/promoted_errors.rs | 2 -- src/test/ui/const-eval/promoted_errors.stderr | 28 ++++++------------- 6 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 src/test/run-fail/promoted_div_by_zero.rs create mode 100644 src/test/run-fail/promoted_overflow.rs create mode 100644 src/test/run-pass/promoted_overflow_opt.rs 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 or the MIT license +// , 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 or the MIT license +// , 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 or the MIT license +// , 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