From ccf90509b8cb211da8aa6a13a877c06d257fc346 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 17 Jul 2015 23:35:41 +0530 Subject: [PATCH] Don't recurse down closures for duplicate-label checking --- src/librustc/middle/resolve_lifetime.rs | 6 ++++++ src/test/run-pass/issue-25343.rs | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/test/run-pass/issue-25343.rs 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 { + } + }; +}