diff --git a/src/libnative/io/process.rs b/src/libnative/io/process.rs index c421dada205fc..59a075f22b28b 100644 --- a/src/libnative/io/process.rs +++ b/src/libnative/io/process.rs @@ -533,6 +533,10 @@ fn spawn_process_os(cfg: ProcessConfig, let dirp = cfg.cwd.map(|c| c.with_ref(|p| p)).unwrap_or(ptr::null()); + let cfg = unsafe { + mem::transmute::>(cfg) + }; + with_envp(cfg.env, proc(envp) { with_argv(cfg.program, cfg.args, proc(argv) unsafe { let (mut input, mut output) = try!(pipe()); diff --git a/src/librustc/middle/kind.rs b/src/librustc/middle/kind.rs index 970ae36238bd6..34754f045ffce 100644 --- a/src/librustc/middle/kind.rs +++ b/src/librustc/middle/kind.rs @@ -198,8 +198,14 @@ fn with_appropriate_checker(cx: &Context, let fty = ty::node_id_to_type(cx.tcx, id); match ty::get(fty).sty { ty::ty_closure(box ty::ClosureTy { - store: ty::UniqTraitStore, bounds, .. - }) => b(|cx, fv| check_for_uniq(cx, fv, bounds)), + store: ty::UniqTraitStore, + bounds: mut bounds, .. + }) => { + // Procs can't close over non-static references! + bounds.add(ty::BoundStatic); + + b(|cx, fv| check_for_uniq(cx, fv, bounds)) + } ty::ty_closure(box ty::ClosureTy { store: ty::RegionTraitStore(region, _), bounds, .. diff --git a/src/test/compile-fail/proc-static-bound.rs b/src/test/compile-fail/proc-static-bound.rs new file mode 100644 index 0000000000000..f11ddc0151f96 --- /dev/null +++ b/src/test/compile-fail/proc-static-bound.rs @@ -0,0 +1,26 @@ +// 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. + +fn main() { + let mut x = Some(1); + let mut p: proc(&mut Option) = proc(_) {}; + match x { + Some(ref y) => { + p = proc(z: &mut Option) { + *z = None; + let _ = y; + //~^ ERROR cannot capture variable of type `&int`, which does not fulfill `'static` + }; + } + None => {} + } + p(&mut x); +} +