diff options
| author | Ariel Ben-Yehuda <arielb1@mail.tau.ac.il> | 2015-09-03 13:35:41 +0300 |
|---|---|---|
| committer | Ariel Ben-Yehuda <arielb1@mail.tau.ac.il> | 2015-09-03 13:35:41 +0300 |
| commit | 16f75f773d27653993b98d50ca5b76bfc351be36 (patch) | |
| tree | 2df085bc1c5d51ecb1ccb6865a858cc2d5e406d2 | |
| parent | 1661947014fc2ecbbb7a30b1604499500dcf767e (diff) | |
| download | rust-16f75f773d27653993b98d50ca5b76bfc351be36.tar.gz rust-16f75f773d27653993b98d50ca5b76bfc351be36.zip | |
create a region-map for types in generics
Fixes #28181 This may fix #28151
| -rw-r--r-- | src/librustc/middle/region.rs | 8 | ||||
| -rw-r--r-- | src/librustc_front/visit.rs | 17 | ||||
| -rw-r--r-- | src/test/run-pass/issue-28181.rs | 15 |
3 files changed, 31 insertions, 9 deletions
diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 38167fd058e..f18c0b1615e 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 703ac6d6e16..f20e5345f20 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 00000000000..f64b92cdbb7 --- /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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn bar<F>(f: F) -> usize where F: Fn([usize; 1]) -> usize { f([2]) } + +fn main() { + bar(|u| { u[0] }); +} |
