diff --git a/src/librustc_mir/hair/cx/expr.rs b/src/librustc_mir/hair/cx/expr.rs index 1dfd77dee1f..b058748fca0 100644 --- a/src/librustc_mir/hair/cx/expr.rs +++ b/src/librustc_mir/hair/cx/expr.rs @@ -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, diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index b9c33ae8c1a..d399543145d 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -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, ), ); diff --git a/src/test/ui/consts/const_short_circuit.rs b/src/test/ui/consts/const_short_circuit.rs new file mode 100644 index 00000000000..9721c1969d5 --- /dev/null +++ b/src/test/ui/consts/const_short_circuit.rs @@ -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() {} \ No newline at end of file diff --git a/src/test/ui/consts/const_short_circuit.stderr b/src/test/ui/consts/const_short_circuit.stderr new file mode 100644 index 00000000000..4c1e531ea87 --- /dev/null +++ b/src/test/ui/consts/const_short_circuit.stderr @@ -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 +