about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Scherer <github35764891676564198441@oli-obk.de>2018-11-26 10:26:42 +0100
committerOliver Scherer <github35764891676564198441@oli-obk.de>2018-11-30 09:44:06 +0100
commitd8ece188b88569da794c2916ee6034a1054d2f35 (patch)
treee747bf73439a5ce9ee31763f6e3adabc4308b0ae
parent75ce28a9745940bbc56110911cfd83b2498bcef6 (diff)
downloadrust-d8ece188b88569da794c2916ee6034a1054d2f35.tar.gz
rust-d8ece188b88569da794c2916ee6034a1054d2f35.zip
Improve the error around short circuiting and let bindings
-rw-r--r--src/librustc_mir/hair/cx/expr.rs8
-rw-r--r--src/librustc_mir/transform/qualify_consts.rs6
-rw-r--r--src/test/ui/consts/const_short_circuit.rs16
-rw-r--r--src/test/ui/consts/const_short_circuit.stderr38
4 files changed, 61 insertions, 7 deletions
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
+