// The dummy functions are used to avoid adding new cfail files. // What happens is that the compiler attempts to squash duplicates and some // errors are not reported. This way, we make sure that, for each function, different // typeck phases are involved and all errors are reported. #![feature(negative_impls)] use std::marker::Send; struct Outer(T); struct Outer2(T); unsafe impl Sync for Outer2 {} fn is_send(_: T) {} fn is_sync(_: T) {} fn dummy() { struct TestType; impl !Send for TestType {} Outer(TestType); //~^ ERROR `dummy::TestType` cannot be sent between threads safely //~| ERROR `dummy::TestType` cannot be sent between threads safely } fn dummy1b() { struct TestType; impl !Send for TestType {} is_send(TestType); //~^ ERROR `dummy1b::TestType` cannot be sent between threads safely } fn dummy1c() { struct TestType; impl !Send for TestType {} is_send((8, TestType)); //~^ ERROR `dummy1c::TestType` cannot be sent between threads safely } fn dummy2() { struct TestType; impl !Send for TestType {} is_send(Box::new(TestType)); //~^ ERROR `dummy2::TestType` cannot be sent between threads safely } fn dummy3() { struct TestType; impl !Send for TestType {} is_send(Box::new(Outer2(TestType))); //~^ ERROR `dummy3::TestType` cannot be sent between threads safely } fn main() { struct TestType; impl !Send for TestType {} // This will complain about a missing Send impl because `Sync` is implement *just* // for T that are `Send`. Look at #20366 and #19950 is_sync(Outer2(TestType)); //~^ ERROR `main::TestType` cannot be sent between threads safely }