From eefeba08f8702481fdb38b915389d5470bc874d0 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Fri, 24 Jul 2015 15:51:54 -0700 Subject: [PATCH] Fix an ICE with a closure in a constant. Fixes issue #27268. --- src/librustc_typeck/check/upvar.rs | 32 +++++++----------------------- src/test/run-pass/issue-27268.rs | 13 ++++++++++++ 2 files changed, 20 insertions(+), 25 deletions(-) create mode 100644 src/test/run-pass/issue-27268.rs diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index 0e3fa654efa..f9b7a330816 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -93,22 +93,8 @@ impl<'a, 'tcx, 'v> Visitor<'v> for SeedBorrowKind<'a, 'tcx> { visit::walk_expr(self, expr); } - fn visit_fn(&mut self, - fn_kind: visit::FnKind<'v>, - decl: &'v ast::FnDecl, - block: &'v ast::Block, - span: Span, - _id: ast::NodeId) - { - match fn_kind { - visit::FkItemFn(..) | visit::FkMethod(..) => { - // ignore nested fn items - } - visit::FkFnBlock => { - visit::walk_fn(self, fn_kind, decl, block, span); - } - } - } + // Skip all items; they aren't in the same context. + fn visit_item(&mut self, _: &'v ast::Item) { } } impl<'a,'tcx> SeedBorrowKind<'a,'tcx> { @@ -515,16 +501,12 @@ impl<'a, 'tcx, 'v> Visitor<'v> for AdjustBorrowKind<'a, 'tcx> { span: Span, id: ast::NodeId) { - match fn_kind { - visit::FkItemFn(..) | visit::FkMethod(..) => { - // ignore nested fn items - } - visit::FkFnBlock => { - visit::walk_fn(self, fn_kind, decl, body, span); - self.analyze_closure(id, span, decl, body); - } - } + visit::walk_fn(self, fn_kind, decl, body, span); + self.analyze_closure(id, span, decl, body); } + + // Skip all items; they aren't in the same context. + fn visit_item(&mut self, _: &'v ast::Item) { } } impl<'a,'tcx> euv::Delegate<'tcx> for AdjustBorrowKind<'a,'tcx> { diff --git a/src/test/run-pass/issue-27268.rs b/src/test/run-pass/issue-27268.rs new file mode 100644 index 00000000000..8af850bbada --- /dev/null +++ b/src/test/run-pass/issue-27268.rs @@ -0,0 +1,13 @@ +// 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() { + const _C: &'static Fn() = &||{}; +}