From 04608413ba1e814e70353369ebde9fc849215157 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sun, 12 Oct 2014 14:43:32 -0700 Subject: [PATCH 1/2] Properly visit nested functions and closures in check_rvalues This correctly catches moves of unsized values in nested functions and closures. Closes issue #17651 --- src/librustc/middle/check_rvalues.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/librustc/middle/check_rvalues.rs b/src/librustc/middle/check_rvalues.rs index 21023986e1c2e..2a2655cc49c66 100644 --- a/src/librustc/middle/check_rvalues.rs +++ b/src/librustc/middle/check_rvalues.rs @@ -32,13 +32,16 @@ struct RvalueContext<'a, 'tcx: 'a> { impl<'a, 'tcx, 'v> visit::Visitor<'v> for RvalueContext<'a, 'tcx> { fn visit_fn(&mut self, - _: visit::FnKind<'v>, + fk: visit::FnKind<'v>, fd: &'v ast::FnDecl, b: &'v ast::Block, - _: Span, + s: Span, _: ast::NodeId) { - let mut euv = euv::ExprUseVisitor::new(self, self.tcx); - euv.walk_fn(fd, b); + { + let mut euv = euv::ExprUseVisitor::new(self, self.tcx); + euv.walk_fn(fd, b); + } + visit::walk_fn(self, fk, fd, b, s) } } From 3caecffe0155e40ec888c16a3987a8582a8b80b1 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sun, 12 Oct 2014 15:14:36 -0700 Subject: [PATCH 2/2] Add regression test for issue #17651 --- src/test/compile-fail/issue-17651.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/compile-fail/issue-17651.rs diff --git a/src/test/compile-fail/issue-17651.rs b/src/test/compile-fail/issue-17651.rs new file mode 100644 index 0000000000000..ef8174a26aa82 --- /dev/null +++ b/src/test/compile-fail/issue-17651.rs @@ -0,0 +1,17 @@ +// Copyright 2014 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. + +// Test that moves of unsized values within closures are caught +// and rejected. + +fn main() { + (|| box *[0u].as_slice())(); + //~^ ERROR cannot move a value of type [uint] +}