Skip to content

Commit d8ece18

Browse files
committed
Improve the error around short circuiting and let bindings
1 parent 75ce28a commit d8ece18

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

src/librustc_mir/hair/cx/expr.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,8 +376,8 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
376376
cx.control_flow_destroyed = true;
377377
cx.tcx.sess.struct_span_warn(
378378
op.span,
379-
"boolean short circuiting operators in constants do
380-
not actually short circuit. Thus new const eval features
379+
"boolean short circuiting operators in constants do \
380+
not actually short circuit. Thus new const eval features \
381381
are not accessible in constants."
382382
).span_suggestion_with_applicability(
383383
op.span,
@@ -395,8 +395,8 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
395395
cx.control_flow_destroyed = true;
396396
cx.tcx.sess.struct_span_warn(
397397
op.span,
398-
"boolean short circuiting operators in constants do
399-
not actually short circuit. Thus new const eval features
398+
"boolean short circuiting operators in constants do \
399+
not actually short circuit. Thus new const eval features \
400400
are not accessible in constants."
401401
).span_suggestion_with_applicability(
402402
op.span,

src/librustc_mir/transform/qualify_consts.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,13 +1184,13 @@ impl MirPass for QualifyAndPromoteConstants {
11841184
promote_consts::promote_candidates(mir, tcx, temps, candidates);
11851185
} else {
11861186
if mir.control_flow_destroyed {
1187-
for local in mir.mut_vars_iter() {
1187+
for local in mir.vars_iter() {
11881188
let span = mir.local_decls[local].source_info.span;
11891189
tcx.sess.span_err(
11901190
span,
11911191
&format!(
1192-
"Cannot have both mutable bindings and \
1193-
short circuiting operators in {}",
1192+
"short circuiting operators do not actually short circuit in {}. \
1193+
Thus new features like let bindings are not permitted",
11941194
mode,
11951195
),
11961196
);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#![feature(underscore_const_names)]
2+
3+
const _: bool = false && false; //~ WARN boolean short circuiting operators in constants
4+
const _: bool = true && false; //~ WARN boolean short circuiting operators in constants
5+
const _: bool = {
6+
let mut x = true && false; //~ WARN boolean short circuiting operators in constants
7+
//~^ ERROR short circuiting operators do not actually short circuit in constant
8+
x
9+
};
10+
const _: bool = {
11+
let x = true && false; //~ WARN boolean short circuiting operators in constants
12+
//~^ ERROR short circuiting operators do not actually short circuit in constant
13+
x
14+
};
15+
16+
fn main() {}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
2+
--> $DIR/const_short_circuit.rs:3:23
3+
|
4+
LL | const _: bool = false && false; //~ WARN boolean short circuiting operators in constants
5+
| ^^ help: use a bit operator instead: `&`
6+
7+
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
8+
--> $DIR/const_short_circuit.rs:4:22
9+
|
10+
LL | const _: bool = true && false; //~ WARN boolean short circuiting operators in constants
11+
| ^^ help: use a bit operator instead: `&`
12+
13+
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
14+
--> $DIR/const_short_circuit.rs:6:22
15+
|
16+
LL | let mut x = true && false; //~ WARN boolean short circuiting operators in constants
17+
| ^^ help: use a bit operator instead: `&`
18+
19+
error: short circuiting operators do not actually short circuit in constant. Thus new features like let bindings are not permitted
20+
--> $DIR/const_short_circuit.rs:6:9
21+
|
22+
LL | let mut x = true && false; //~ WARN boolean short circuiting operators in constants
23+
| ^^^^^
24+
25+
warning: boolean short circuiting operators in constants do not actually short circuit. Thus new const eval features are not accessible in constants.
26+
--> $DIR/const_short_circuit.rs:11:18
27+
|
28+
LL | let x = true && false; //~ WARN boolean short circuiting operators in constants
29+
| ^^ help: use a bit operator instead: `&`
30+
31+
error: short circuiting operators do not actually short circuit in constant. Thus new features like let bindings are not permitted
32+
--> $DIR/const_short_circuit.rs:11:9
33+
|
34+
LL | let x = true && false; //~ WARN boolean short circuiting operators in constants
35+
| ^
36+
37+
error: aborting due to 2 previous errors
38+

0 commit comments

Comments
 (0)