2018-05-22 07:31:56 -05:00
|
|
|
use std::cell::Cell;
|
|
|
|
use std::rc::Rc;
|
|
|
|
|
|
|
|
// Fast path, main can see the concrete type returned.
|
|
|
|
fn before() -> impl Fn(i32) {
|
|
|
|
let p = Rc::new(Cell::new(0));
|
|
|
|
move |x| p.set(x)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn send<T: Send>(_: T) {}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
send(before());
|
2018-06-09 18:53:36 -05:00
|
|
|
//~^ ERROR `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely
|
2018-05-22 07:31:56 -05:00
|
|
|
|
|
|
|
send(after());
|
2018-06-09 18:53:36 -05:00
|
|
|
//~^ ERROR `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely
|
2018-05-22 07:31:56 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Deferred path, main has to wait until typeck finishes,
|
|
|
|
// to check if the return type of after is Send.
|
|
|
|
fn after() -> impl Fn(i32) {
|
|
|
|
let p = Rc::new(Cell::new(0));
|
|
|
|
move |x| p.set(x)
|
|
|
|
}
|