1
Fork 0

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.control_flow_destroyed = true;
cx.tcx.sess.struct_span_warn( cx.tcx.sess.struct_span_warn(
op.span, op.span,
"boolean short circuiting operators in constants do "boolean short circuiting operators in constants do \
not actually short circuit. Thus new const eval features not actually short circuit. Thus new const eval features \
are not accessible in constants." are not accessible in constants."
).span_suggestion_with_applicability( ).span_suggestion_with_applicability(
op.span, 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.control_flow_destroyed = true;
cx.tcx.sess.struct_span_warn( cx.tcx.sess.struct_span_warn(
op.span, op.span,
"boolean short circuiting operators in constants do "boolean short circuiting operators in constants do \
not actually short circuit. Thus new const eval features not actually short circuit. Thus new const eval features \
are not accessible in constants." are not accessible in constants."
).span_suggestion_with_applicability( ).span_suggestion_with_applicability(
op.span, op.span,

View file

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