From 22c88323f3175340b8f837fdbb9e78fd742da024 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Sat, 14 Feb 2015 16:05:15 +1100 Subject: [PATCH] Add tests for the removal of the 'static superbound from Send. --- .../send-is-not-static-ensures-scoping.rs | 25 ++++++++++ .../run-pass/send-is-not-static-par-for.rs | 47 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100755 src/test/compile-fail/send-is-not-static-ensures-scoping.rs create mode 100755 src/test/run-pass/send-is-not-static-par-for.rs diff --git a/src/test/compile-fail/send-is-not-static-ensures-scoping.rs b/src/test/compile-fail/send-is-not-static-ensures-scoping.rs new file mode 100755 index 00000000000..0b74892d66c --- /dev/null +++ b/src/test/compile-fail/send-is-not-static-ensures-scoping.rs @@ -0,0 +1,25 @@ +// 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. + +#![feature(core, std_misc)] +use std::thread::Thread; + +fn main() { + let bad = { + let x = 1; + let y = &x; + + Thread::scoped(|| { //~ ERROR cannot infer an appropriate lifetime + let _z = y; + }) + }; + + bad.join().ok().unwrap(); +} diff --git a/src/test/run-pass/send-is-not-static-par-for.rs b/src/test/run-pass/send-is-not-static-par-for.rs new file mode 100755 index 00000000000..c6b64d97fbd --- /dev/null +++ b/src/test/run-pass/send-is-not-static-par-for.rs @@ -0,0 +1,47 @@ +// 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. + +#![feature(core, std_misc)] +use std::thread::Thread; +use std::sync::Mutex; + +fn par_for(iter: I, f: F) + where I: Iterator, + ::Item: Send, + F: Fn(::Item) + Sync +{ + let f = &f; + let _guards: Vec<_> = iter.map(|elem| { + Thread::scoped(move || { + f(elem) + }) + }).collect(); + +} + +fn sum(x: &[i32]) { + let sum_lengths = Mutex::new(0); + par_for(x.windows(4), |x| { + *sum_lengths.lock().unwrap() += x.len() + }); + + assert_eq!(*sum_lengths.lock().unwrap(), (x.len() - 3) * 4); +} + +fn main() { + let mut elements = [0; 20]; + + // iterators over references into this stack frame + par_for(elements.iter_mut().enumerate(), |(i, x)| { + *x = i as i32 + }); + + sum(&elements) +}