diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 38167fd058e9f..f18c0b1615ecc 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -317,7 +317,10 @@ impl RegionMaps { self.intern_code_extent(e, DUMMY_CODE_EXTENT) } pub fn lookup_code_extent(&self, e: CodeExtentData) -> CodeExtent { - self.code_extent_interner.borrow()[&e] + match self.code_extent_interner.borrow().get(&e) { + Some(&d) => d, + None => panic!("unknown code extent {:?}", e) + } } pub fn node_extent(&self, n: ast::NodeId) -> CodeExtent { self.lookup_code_extent(CodeExtentData::Misc(n)) @@ -1069,7 +1072,7 @@ fn resolve_item(visitor: &mut RegionResolutionVisitor, item: &hir::Item) { } fn resolve_fn(visitor: &mut RegionResolutionVisitor, - _: FnKind, + kind: FnKind, decl: &hir::FnDecl, body: &hir::Block, sp: Span, @@ -1102,6 +1105,7 @@ fn resolve_fn(visitor: &mut RegionResolutionVisitor, }; visit::walk_fn_decl(visitor, decl); + visit::walk_fn_kind(visitor, kind); // The body of the every fn is a root scope. visitor.cx = Context { diff --git a/src/librustc_front/visit.rs b/src/librustc_front/visit.rs index 703ac6d6e1649..f20e5345f2066 100644 --- a/src/librustc_front/visit.rs +++ b/src/librustc_front/visit.rs @@ -580,13 +580,8 @@ pub fn walk_fn_decl<'v, V: Visitor<'v>>(visitor: &mut V, function_declaration: & walk_fn_ret_ty(visitor, &function_declaration.output) } -pub fn walk_fn<'v, V: Visitor<'v>>(visitor: &mut V, - function_kind: FnKind<'v>, - function_declaration: &'v FnDecl, - function_body: &'v Block, - _span: Span) { - walk_fn_decl(visitor, function_declaration); - +pub fn walk_fn_kind<'v, V: Visitor<'v>>(visitor: &mut V, + function_kind: FnKind<'v>) { match function_kind { FnKind::ItemFn(_, generics, _, _, _, _) => { visitor.visit_generics(generics); @@ -597,7 +592,15 @@ pub fn walk_fn<'v, V: Visitor<'v>>(visitor: &mut V, } FnKind::Closure(..) => {} } +} +pub fn walk_fn<'v, V: Visitor<'v>>(visitor: &mut V, + function_kind: FnKind<'v>, + function_declaration: &'v FnDecl, + function_body: &'v Block, + _span: Span) { + walk_fn_decl(visitor, function_declaration); + walk_fn_kind(visitor, function_kind); visitor.visit_block(function_body) } diff --git a/src/test/run-pass/issue-28181.rs b/src/test/run-pass/issue-28181.rs new file mode 100644 index 0000000000000..f64b92cdbb763 --- /dev/null +++ b/src/test/run-pass/issue-28181.rs @@ -0,0 +1,15 @@ +// 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 bar(f: F) -> usize where F: Fn([usize; 1]) -> usize { f([2]) } + +fn main() { + bar(|u| { u[0] }); +}