Improve the error around short circuiting and let bindings

This commit is contained in:
Oliver Scherer 2018-11-26 10:26:42 +01:00
parent 75ce28a974
commit d8ece188b8
4 changed files with 61 additions and 7 deletions

View File

@ -376,8 +376,8 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
cx.control_flow_destroyed = true;
cx.tcx.sess.struct_span_warn(
op.span,
"boolean short circuiting operators in constants do
not actually short circuit. Thus new const eval features
"boolean short circuiting operators in constants do \
not actually short circuit. Thus new const eval features \
are not accessible in constants."
).span_suggestion_with_applicability(
op.span,
@ -395,8 +395,8 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
cx.control_flow_destroyed = true;
cx.tcx.sess.struct_span_warn(
op.span,
"boolean short circuiting operators in constants do
not actually short circuit. Thus new const eval features
"boolean short circuiting operators in constants do \
not actually short circuit. Thus new const eval features \
are not accessible in constants."
).span_suggestion_with_applicability(
op.span,

View File

@ -1184,13 +1184,13 @@ impl MirPass for QualifyAndPromoteConstants {
promote_consts::promote_candidates(mir, tcx, temps, candidates);
} else {
if mir.control_flow_destroyed {
for local in mir.mut_vars_iter() {
for local in mir.vars_iter() {
let span = mir.local_decls[local].source_info.span;
tcx.sess.span_err(
span,
&format!(
"Cannot have both mutable bindings and \
short circuiting operators in {}",
"short circuiting operators do not actually short circuit in {}. \
Thus new features like let bindings are not permitted",
mode,
),
);

View File

@ -0,0 +1,16 @@
#![feature(underscore_const_names)]
const _: bool = false && false; //~ WARN boolean short circuiting operators in constants
const _: bool = true && false; //~ WARN boolean short circuiting operators in constants
const _: bool = {
let mut x = true && false; //~ WARN boolean short circuiting operators in constants
//~^ ERROR short circuiting operators do not actually short circuit in constant
x
};
const _: bool = {
let x = true && false; //~ WARN boolean short circuiting operators in constants
//~^ ERROR short circuiting operators do not actually short circuit in constant
x
};
fn main() {}

View File

@ -0,0 +1,38 @@
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
--> $DIR/const_short_circuit.rs:3:23
|
LL | const _: bool = false && false; //~ WARN boolean short circuiting operators in constants
| ^^ help: use a bit operator instead: `&`
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
--> $DIR/const_short_circuit.rs:4:22
|
LL | const _: bool = true && false; //~ WARN boolean short circuiting operators in constants
| ^^ help: use a bit operator instead: `&`
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
--> $DIR/const_short_circuit.rs:6:22
|
LL | let mut x = true && false; //~ WARN boolean short circuiting operators in constants
| ^^ help: use a bit operator instead: `&`
error: short circuiting operators do not actually short circuit in constant. Thus new features like let bindings are not permitted
--> $DIR/const_short_circuit.rs:6:9
|
LL | let mut x = true && false; //~ WARN boolean short circuiting operators in constants
| ^^^^^
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
--> $DIR/const_short_circuit.rs:11:18
|
LL | let x = true && false; //~ WARN boolean short circuiting operators in constants
| ^^ help: use a bit operator instead: `&`
error: short circuiting operators do not actually short circuit in constant. Thus new features like let bindings are not permitted
--> $DIR/const_short_circuit.rs:11:9
|
LL | let x = true && false; //~ WARN boolean short circuiting operators in constants
| ^
error: aborting due to 2 previous errors