Improve the error around short circuiting and let bindings
This commit is contained in:
parent
75ce28a974
commit
d8ece188b8
4 changed files with 61 additions and 7 deletions
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
16
src/test/ui/consts/const_short_circuit.rs
Normal file
16
src/test/ui/consts/const_short_circuit.rs
Normal 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() {}
|
38
src/test/ui/consts/const_short_circuit.stderr
Normal file
38
src/test/ui/consts/const_short_circuit.stderr
Normal 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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue