Skip to content

Don't report compile-time errors for promoteds #49779

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/librustc_mir/interpret/const_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ pub fn mk_eval_cx<'a, 'tcx>(
Ok(ecx)
}

pub fn eval_body_with_mir<'a, 'mir, 'tcx>(
pub fn eval_promoted<'a, 'mir, 'tcx>(
tcx: TyCtxt<'a, 'tcx, 'tcx>,
cid: GlobalId<'tcx>,
mir: &'mir mir::Mir<'tcx>,
Expand All @@ -67,7 +67,7 @@ pub fn eval_body_with_mir<'a, 'mir, 'tcx>(
match res {
Ok(val) => Some(val),
Err(mut err) => {
ecx.report(&mut err, true, None);
ecx.report(&mut err, false, None);
None
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/interpret/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub use self::place::{Place, PlaceExtra};
pub use self::memory::{Memory, MemoryKind, HasMemory};

pub use self::const_eval::{
eval_body_with_mir,
eval_promoted,
mk_borrowck_eval_cx,
eval_body,
CompileTimeEvaluator,
Expand Down
6 changes: 2 additions & 4 deletions src/librustc_mir/monomorphize/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1177,17 +1177,15 @@ fn collect_neighbours<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
param_substs: instance.substs,
}.visit_mir(&mir);
let param_env = ty::ParamEnv::reveal_all();
for (i, promoted) in mir.promoted.iter().enumerate() {
for i in 0..mir.promoted.len() {
use rustc_data_structures::indexed_vec::Idx;
let cid = GlobalId {
instance,
promoted: Some(Promoted::new(i)),
};
match tcx.const_eval(param_env.and(cid)) {
Ok(val) => collect_const(tcx, val, instance.substs, output),
Err(err) => {
err.report(tcx, promoted.span, "promoted");
}
Err(_) => {},
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/librustc_mir/transform/const_prop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use rustc::mir::visit::{Visitor, PlaceContext};
use rustc::middle::const_val::ConstVal;
use rustc::ty::{TyCtxt, self, Instance};
use rustc::mir::interpret::{Value, PrimVal, GlobalId};
use interpret::{eval_body_with_mir, mk_borrowck_eval_cx, ValTy};
use interpret::{eval_promoted, mk_borrowck_eval_cx, ValTy};
use transform::{MirPass, MirSource};
use syntax::codemap::Span;
use rustc::ty::subst::Substs;
Expand Down Expand Up @@ -161,7 +161,7 @@ impl<'b, 'a, 'tcx:'b> ConstPropagator<'b, 'a, 'tcx> {
};
// cannot use `const_eval` here, because that would require having the MIR
// for the current function available, but we're producing said MIR right now
let (value, _, ty) = eval_body_with_mir(self.tcx, cid, self.mir, self.param_env)?;
let (value, _, ty) = eval_promoted(self.tcx, cid, self.mir, self.param_env)?;
let val = (value, ty, c.span);
trace!("evaluated {:?} to {:?}", c, val);
Some(val)
Expand Down
9 changes: 8 additions & 1 deletion src/librustc_trans/mir/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,14 @@ impl<'a, 'tcx> FunctionCx<'a, 'tcx> {
self.mir_constant_to_miri_value(bx, constant)
.and_then(|c| OperandRef::from_const(bx, c, ty))
.unwrap_or_else(|err| {
err.report(bx.tcx(), constant.span, "const operand");
match constant.literal {
mir::Literal::Promoted { .. } => {
// don't report errors inside promoteds, just warnings.
},
mir::Literal::Value { .. } => {
err.report(bx.tcx(), constant.span, "const operand")
},
}
// We've errored, so we don't have to produce working code.
let layout = bx.cx.layout_of(ty);
PlaceRef::new_sized(
Expand Down
5 changes: 4 additions & 1 deletion src/test/ui/const-eval/conditional_array_execution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// compile-pass

const X: u32 = 5;
const Y: u32 = 6;
const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
//~^ WARN attempt to subtract with overflow

fn main() {
println!("{}", FOO); //~ E0080
println!("{}", FOO);
//~^ WARN constant evaluation error
}
11 changes: 4 additions & 7 deletions src/test/ui/const-eval/conditional_array_execution.stderr
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
warning: attempt to subtract with overflow
--> $DIR/conditional_array_execution.rs:13:19
--> $DIR/conditional_array_execution.rs:15:19
|
LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
| ^^^^^
|
= note: #[warn(const_err)] on by default

error[E0080]: constant evaluation error
--> $DIR/conditional_array_execution.rs:17:20
warning: constant evaluation error
--> $DIR/conditional_array_execution.rs:19:20
|
LL | println!("{}", FOO); //~ E0080
LL | println!("{}", FOO);
| ^^^ referenced constant has errors

error: aborting due to previous error

For more information about this error, try `rustc --explain E0080`.
6 changes: 4 additions & 2 deletions src/test/ui/const-eval/issue-43197.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// compile-pass

#![feature(const_fn)]

const fn foo(x: u32) -> u32 {
Expand All @@ -20,6 +22,6 @@ fn main() {
const Y: u32 = foo(0-1);
//~^ WARN attempt to subtract with overflow
println!("{} {}", X, Y);
//~^ ERROR constant evaluation error
//~| ERROR constant evaluation error
//~^ WARN constant evaluation error
//~| WARN constant evaluation error
}
15 changes: 6 additions & 9 deletions src/test/ui/const-eval/issue-43197.stderr
Original file line number Diff line number Diff line change
@@ -1,29 +1,26 @@
warning: attempt to subtract with overflow
--> $DIR/issue-43197.rs:18:20
--> $DIR/issue-43197.rs:20:20
|
LL | const X: u32 = 0-1;
| ^^^
|
= note: #[warn(const_err)] on by default

error[E0080]: constant evaluation error
--> $DIR/issue-43197.rs:22:23
warning: constant evaluation error
--> $DIR/issue-43197.rs:24:23
|
LL | println!("{} {}", X, Y);
| ^ referenced constant has errors

warning: attempt to subtract with overflow
--> $DIR/issue-43197.rs:20:24
--> $DIR/issue-43197.rs:22:24
|
LL | const Y: u32 = foo(0-1);
| ^^^

error[E0080]: constant evaluation error
--> $DIR/issue-43197.rs:22:26
warning: constant evaluation error
--> $DIR/issue-43197.rs:24:26
|
LL | println!("{} {}", X, Y);
| ^ referenced constant has errors

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0080`.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// compile-pass

trait Foo {
const AMT: usize;
}
Expand All @@ -30,5 +32,6 @@ impl Foo for u16 {
}

fn main() {
println!("{}", <Bar<u16, u8> as Foo>::AMT); //~ E0080
println!("{}", <Bar<u16, u8> as Foo>::AMT); //~ WARN const_err
//~^ WARN const_err
}
14 changes: 14 additions & 0 deletions src/test/ui/const-eval/issue-44578.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
warning: constant evaluation error
--> $DIR/issue-44578.rs:35:20
|
LL | println!("{}", <Bar<u16, u8> as Foo>::AMT); //~ WARN const_err
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
|
= note: #[warn(const_err)] on by default

warning: constant evaluation error
--> $DIR/issue-44578.rs:35:20
|
LL | println!("{}", <Bar<u16, u8> as Foo>::AMT); //~ WARN const_err
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors

28 changes: 28 additions & 0 deletions src/test/ui/const-eval/promoted_errors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// 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.

// compile-pass
// 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));
//~^ WARN const_err
//~| WARN const_err
let _x = 1/(1-1);
//~^ WARN const_err
//~| WARN const_err
println!("{}", 1/(false as u32));
//~^ WARN const_err
let _x = 1/(false as u32);
}
50 changes: 50 additions & 0 deletions src/test/ui/const-eval/promoted_errors.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
warning: constant evaluation error
--> $DIR/promoted_errors.rs:14:20
|
LL | println!("{}", 0u32 - 1);
| ^^^^^^^^ attempted to do overflowing math
|
= note: #[warn(const_err)] on by default

warning: constant evaluation error
--> $DIR/promoted_errors.rs:14:20
|
LL | println!("{}", 0u32 - 1);
| ^^^^^^^^ attempted to do overflowing math

warning: constant evaluation error
--> $DIR/promoted_errors.rs:17:14
|
LL | let _x = 0u32 - 1;
| ^^^^^^^^ attempted to do overflowing math

warning: attempt to divide by zero
--> $DIR/promoted_errors.rs:19:20
|
LL | println!("{}", 1/(1-1));
| ^^^^^^^

warning: constant evaluation error
--> $DIR/promoted_errors.rs:19:20
|
LL | println!("{}", 1/(1-1));
| ^^^^^^^ attempted to do overflowing math

warning: attempt to divide by zero
--> $DIR/promoted_errors.rs:22:14
|
LL | let _x = 1/(1-1);
| ^^^^^^^

warning: constant evaluation error
--> $DIR/promoted_errors.rs:22:14
|
LL | let _x = 1/(1-1);
| ^^^^^^^ attempted to do overflowing math

warning: constant evaluation error
--> $DIR/promoted_errors.rs:25:20
|
LL | println!("{}", 1/(false as u32));
| ^^^^^^^^^^^^^^^^ attempted to do overflowing math