Fix const_err with -(-0.0)
This commit is contained in:
parent
d0677b9abc
commit
35c9e5f122
4 changed files with 13 additions and 27 deletions
|
@ -6,7 +6,7 @@ use std::cell::Cell;
|
||||||
use rustc::hir::def::DefKind;
|
use rustc::hir::def::DefKind;
|
||||||
use rustc::mir::{
|
use rustc::mir::{
|
||||||
AggregateKind, Constant, Location, Place, PlaceBase, Body, Operand, Rvalue,
|
AggregateKind, Constant, Location, Place, PlaceBase, Body, Operand, Rvalue,
|
||||||
Local, NullOp, UnOp, StatementKind, Statement, LocalKind, Static, StaticKind,
|
Local, NullOp, StatementKind, Statement, LocalKind, Static, StaticKind,
|
||||||
TerminatorKind, Terminator, ClearCrossCrate, SourceInfo, BinOp, ProjectionElem,
|
TerminatorKind, Terminator, ClearCrossCrate, SourceInfo, BinOp, ProjectionElem,
|
||||||
SourceScope, SourceScopeLocalData, LocalDecl,
|
SourceScope, SourceScopeLocalData, LocalDecl,
|
||||||
};
|
};
|
||||||
|
@ -407,18 +407,6 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
||||||
let arg = self.eval_operand(arg, source_info)?;
|
let arg = self.eval_operand(arg, source_info)?;
|
||||||
let val = self.use_ecx(source_info, |this| {
|
let val = self.use_ecx(source_info, |this| {
|
||||||
let prim = this.ecx.read_immediate(arg)?;
|
let prim = this.ecx.read_immediate(arg)?;
|
||||||
match op {
|
|
||||||
UnOp::Neg => {
|
|
||||||
// Need to do overflow check here: For actual CTFE, MIR
|
|
||||||
// generation emits code that does this before calling the op.
|
|
||||||
if prim.to_bits()? == (1 << (prim.layout.size.bits() - 1)) {
|
|
||||||
throw_panic!(OverflowNeg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UnOp::Not => {
|
|
||||||
// Cannot overflow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Now run the actual operation.
|
// Now run the actual operation.
|
||||||
this.ecx.unary_op(op, prim)
|
this.ecx.unary_op(op, prim)
|
||||||
})?;
|
})?;
|
||||||
|
|
|
@ -13,7 +13,6 @@ fn black_box<T>(_: T) {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let a = -std::i8::MIN;
|
let a = -std::i8::MIN;
|
||||||
//~^ ERROR const_err
|
|
||||||
let b = 200u8 + 200u8 + 200u8;
|
let b = 200u8 + 200u8 + 200u8;
|
||||||
//~^ ERROR const_err
|
//~^ ERROR const_err
|
||||||
let c = 200u8 * 4;
|
let c = 200u8 * 4;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
error: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/const-err2.rs:15:13
|
--> $DIR/const-err2.rs:16:13
|
||||||
|
|
|
|
||||||
LL | let a = -std::i8::MIN;
|
LL | let b = 200u8 + 200u8 + 200u8;
|
||||||
| ^^^^^^^^^^^^^ attempt to negate with overflow
|
| ^^^^^^^^^^^^^ attempt to add with overflow
|
||||||
|
|
|
|
||||||
note: lint level defined here
|
note: lint level defined here
|
||||||
--> $DIR/const-err2.rs:8:9
|
--> $DIR/const-err2.rs:8:9
|
||||||
|
@ -11,28 +11,22 @@ LL | #![deny(const_err)]
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/const-err2.rs:17:13
|
--> $DIR/const-err2.rs:18:13
|
||||||
|
|
|
||||||
LL | let b = 200u8 + 200u8 + 200u8;
|
|
||||||
| ^^^^^^^^^^^^^ attempt to add with overflow
|
|
||||||
|
|
||||||
error: this expression will panic at runtime
|
|
||||||
--> $DIR/const-err2.rs:19:13
|
|
||||||
|
|
|
|
||||||
LL | let c = 200u8 * 4;
|
LL | let c = 200u8 * 4;
|
||||||
| ^^^^^^^^^ attempt to multiply with overflow
|
| ^^^^^^^^^ attempt to multiply with overflow
|
||||||
|
|
||||||
error: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/const-err2.rs:21:13
|
--> $DIR/const-err2.rs:20:13
|
||||||
|
|
|
|
||||||
LL | let d = 42u8 - (42u8 + 1);
|
LL | let d = 42u8 - (42u8 + 1);
|
||||||
| ^^^^^^^^^^^^^^^^^ attempt to subtract with overflow
|
| ^^^^^^^^^^^^^^^^^ attempt to subtract with overflow
|
||||||
|
|
||||||
error: index out of bounds: the len is 1 but the index is 1
|
error: index out of bounds: the len is 1 but the index is 1
|
||||||
--> $DIR/const-err2.rs:23:14
|
--> $DIR/const-err2.rs:22:14
|
||||||
|
|
|
|
||||||
LL | let _e = [5u8][1];
|
LL | let _e = [5u8][1];
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
|
5
src/test/ui/consts/issue-64059.rs
Normal file
5
src/test/ui/consts/issue-64059.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// run-pass
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = -(-0.0);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue