about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <arielb1@mail.tau.ac.il>2015-09-03 13:35:41 +0300
committerAriel Ben-Yehuda <arielb1@mail.tau.ac.il>2015-09-03 13:35:41 +0300
commit16f75f773d27653993b98d50ca5b76bfc351be36 (patch)
tree2df085bc1c5d51ecb1ccb6865a858cc2d5e406d2
parent1661947014fc2ecbbb7a30b1604499500dcf767e (diff)
downloadrust-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.rs8
-rw-r--r--src/librustc_front/visit.rs17
-rw-r--r--src/test/run-pass/issue-28181.rs15
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] });
+}