about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-07-01 18:31:07 +0100
committervarkor <github@varkor.com>2018-07-02 19:44:27 +0100
commit30fde047804b6555ad982e7d55fea9e54815ea39 (patch)
tree6af4f4cd792efeb22dd9b05ba090e787eefd0588 /src
parentb00050f4cf7d602566afd511b66ae6645f92987d (diff)
downloadrust-30fde047804b6555ad982e7d55fea9e54815ea39.tar.gz
rust-30fde047804b6555ad982e7d55fea9e54815ea39.zip
Clean up error messages regarding break/continue inside consts
Diffstat (limited to 'src')
-rw-r--r--src/librustc/hir/lowering.rs60
-rw-r--r--src/test/ui/closure-array-break-length.rs6
-rw-r--r--src/test/ui/closure-array-break-length.stderr23
3 files changed, 42 insertions, 47 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index e59e50ae9e6..2365bdda932 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -103,6 +103,7 @@ pub struct LoweringContext<'a> {
     loop_scopes: Vec<NodeId>,
     is_in_loop_condition: bool,
     is_in_trait_impl: bool,
+    is_in_anon_const: bool,
 
     /// What to do when we encounter either an "anonymous lifetime
     /// reference". The term "anonymous" is meant to encompass both
@@ -230,6 +231,7 @@ pub fn lower_crate(
         node_id_to_hir_id: IndexVec::new(),
         is_generator: false,
         is_in_trait_impl: false,
+        is_in_anon_const: false,
         lifetimes_to_define: Vec::new(),
         is_collecting_in_band_lifetimes: false,
         in_scope_lifetimes: Vec::new(),
@@ -968,31 +970,30 @@ impl<'a> LoweringContext<'a> {
     }
 
     fn lower_loop_destination(&mut self, destination: Option<(NodeId, Label)>) -> hir::Destination {
-        match destination {
-            Some((id, label)) => {
-                let target_id = if let Def::Label(loop_id) = self.expect_full_def(id) {
-                    Ok(self.lower_node_id(loop_id).node_id)
-                } else {
-                    Err(hir::LoopIdError::UnresolvedLabel)
-                };
-                hir::Destination {
-                    label: self.lower_label(Some(label)),
-                    target_id,
+        let target_id = if self.is_in_anon_const {
+            Err(hir::LoopIdError::OutsideLoopScope)
+        } else {
+            match destination {
+                Some((id, _)) => {
+                    if let Def::Label(loop_id) = self.expect_full_def(id) {
+                        Ok(self.lower_node_id(loop_id).node_id)
+                    } else {
+                        Err(hir::LoopIdError::UnresolvedLabel)
+                    }
                 }
-            }
-            None => {
-                let target_id = self.loop_scopes
-                    .last()
-                    .map(|innermost_loop_id| *innermost_loop_id)
-                    .map(|id| Ok(self.lower_node_id(id).node_id))
-                    .unwrap_or(Err(hir::LoopIdError::OutsideLoopScope))
-                    .into();
-
-                hir::Destination {
-                    label: None,
-                    target_id,
+                None => {
+                    self.loop_scopes
+                        .last()
+                        .map(|innermost_loop_id| *innermost_loop_id)
+                        .map(|id| Ok(self.lower_node_id(id).node_id))
+                        .unwrap_or(Err(hir::LoopIdError::OutsideLoopScope))
+                        .into()
                 }
             }
+        };
+        hir::Destination {
+            label: self.lower_label(destination.map(|(_, label)| label)),
+            target_id,
         }
     }
 
@@ -3440,13 +3441,22 @@ impl<'a> LoweringContext<'a> {
     }
 
     fn lower_anon_const(&mut self, c: &AnonConst) -> hir::AnonConst {
-        let LoweredNodeId { node_id, hir_id } = self.lower_node_id(c.id);
+        let was_in_loop_condition = self.is_in_loop_condition;
+        self.is_in_loop_condition = false;
+        let was_in_anon_const = self.is_in_anon_const;
+        self.is_in_anon_const = true;
 
-        hir::AnonConst {
+        let LoweredNodeId { node_id, hir_id } = self.lower_node_id(c.id);
+        let anon_const = hir::AnonConst {
             id: node_id,
             hir_id,
             body: self.lower_body(None, |this| this.lower_expr(&c.value)),
-        }
+        };
+
+        self.is_in_anon_const = was_in_anon_const;
+        self.is_in_loop_condition = was_in_loop_condition;
+
+        anon_const
     }
 
     fn lower_expr(&mut self, e: &Expr) -> hir::Expr {
diff --git a/src/test/ui/closure-array-break-length.rs b/src/test/ui/closure-array-break-length.rs
index 727113e328f..8be5b925a39 100644
--- a/src/test/ui/closure-array-break-length.rs
+++ b/src/test/ui/closure-array-break-length.rs
@@ -11,9 +11,7 @@
 fn main() {
     |_: [_; continue]| {}; //~ ERROR: `continue` outside of loop
 
-    while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
-    //~^ ERROR: `continue` outside of loop
+    while |_: [_; continue]| {} {} //~ ERROR: `continue` outside of loop
 
-    while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
-    //~^ ERROR: `break` outside of loop
+    while |_: [_; break]| {} {} //~ ERROR: `break` outside of loop
 }
diff --git a/src/test/ui/closure-array-break-length.stderr b/src/test/ui/closure-array-break-length.stderr
index a337645fb7e..f62b1354370 100644
--- a/src/test/ui/closure-array-break-length.stderr
+++ b/src/test/ui/closure-array-break-length.stderr
@@ -4,31 +4,18 @@ error[E0268]: `continue` outside of loop
 LL |     |_: [_; continue]| {}; //~ ERROR: `continue` outside of loop
    |             ^^^^^^^^ cannot break outside of a loop
 
-error[E0590]: `break` or `continue` with no label in the condition of a `while` loop
-  --> $DIR/closure-array-break-length.rs:14:19
-   |
-LL |     while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
-   |                   ^^^^^^^^ unlabeled `continue` in the condition of a `while` loop
-
 error[E0268]: `continue` outside of loop
   --> $DIR/closure-array-break-length.rs:14:19
    |
-LL |     while |_: [_; continue]| {} {} //~ ERROR: `break` or `continue` with no label
+LL |     while |_: [_; continue]| {} {} //~ ERROR: `continue` outside of loop
    |                   ^^^^^^^^ cannot break outside of a loop
 
-error[E0590]: `break` or `continue` with no label in the condition of a `while` loop
-  --> $DIR/closure-array-break-length.rs:17:19
-   |
-LL |     while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
-   |                   ^^^^^ unlabeled `break` in the condition of a `while` loop
-
 error[E0268]: `break` outside of loop
-  --> $DIR/closure-array-break-length.rs:17:19
+  --> $DIR/closure-array-break-length.rs:16:19
    |
-LL |     while |_: [_; break]| {} {} //~ ERROR: `break` or `continue` with no label
+LL |     while |_: [_; break]| {} {} //~ ERROR: `break` outside of loop
    |                   ^^^^^ cannot break outside of a loop
 
-error: aborting due to 5 previous errors
+error: aborting due to 3 previous errors
 
-Some errors occurred: E0268, E0590.
-For more information about an error, try `rustc --explain E0268`.
+For more information about this error, try `rustc --explain E0268`.