diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index 9e5ad7b42f5c5..510f1a2a2c9d8 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -372,6 +372,12 @@ fn extract_labels<'v, 'a>(ctxt: &mut LifetimeContext<'a>, b: &'v ast::Block) { impl<'v, 'a> Visitor<'v> for GatherLabels<'a> { fn visit_expr(&mut self, ex: &'v ast::Expr) { + // do not recurse into closures defined in the block + // since they are treated as separate fns from the POV of + // labels_in_fn + if let ast::ExprClosure(..) = ex.node { + return + } if let Some(label) = expression_label(ex) { for &(prior, prior_span) in &self.labels_in_fn[..] { // FIXME (#24278): non-hygienic comparison diff --git a/src/test/run-pass/issue-25343.rs b/src/test/run-pass/issue-25343.rs new file mode 100644 index 0000000000000..9e01d577276b8 --- /dev/null +++ b/src/test/run-pass/issue-25343.rs @@ -0,0 +1,16 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + || { + 'label: loop { + } + }; +}