]> git.lizzy.rs Git - rust.git/commitdiff
Improve the error around short circuiting and let bindings
authorOliver Scherer <github35764891676564198441@oli-obk.de>
Mon, 26 Nov 2018 09:26:42 +0000 (10:26 +0100)
committerOliver Scherer <github35764891676564198441@oli-obk.de>
Fri, 30 Nov 2018 08:44:06 +0000 (09:44 +0100)
src/librustc_mir/hair/cx/expr.rs
src/librustc_mir/transform/qualify_consts.rs
src/test/ui/consts/const_short_circuit.rs [new file with mode: 0644]
src/test/ui/consts/const_short_circuit.stderr [new file with mode: 0644]

index 1dfd77dee1fed827734877745570dcec755650ea..b058748fca0243274f040d575b0b3ed6786f4702 100644 (file)
@@ -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,
index b9c33ae8c1afa678445d46f987beeaf3cea15efe..d399543145dff92df615122beae5ce476a2beb82 100644 (file)
@@ -1184,13 +1184,13 @@ fn run_pass<'a, 'tcx>(&self,
             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 (file)
index 0000000..9721c19
--- /dev/null
@@ -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 (file)
index 0000000..4c1e531
--- /dev/null
@@ -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
+