#![warn(clippy::non_send_fields_in_send_ty)] #![allow(suspicious_auto_trait_impls)] #![feature(extern_types)] use std::cell::UnsafeCell; use std::ptr::NonNull; use std::rc::Rc; use std::sync::{Arc, Mutex, MutexGuard}; // disrustor / RUSTSEC-2020-0150 pub struct RingBuffer { data: Vec>, capacity: usize, mask: usize, } unsafe impl Send for RingBuffer {} // noise_search / RUSTSEC-2020-0141 pub struct MvccRwLock { raw: *const T, lock: Mutex>, } unsafe impl Send for MvccRwLock {} // async-coap / RUSTSEC-2020-0124 pub struct ArcGuard { inner: T, head: Arc, } unsafe impl Send for ArcGuard {} // rusb / RUSTSEC-2020-0098 extern "C" { type libusb_device_handle; } pub trait UsbContext { // some user trait that does not guarantee `Send` } pub struct DeviceHandle { context: T, handle: NonNull, } unsafe impl Send for DeviceHandle {} // Other basic tests pub struct NoGeneric { rc_is_not_send: Rc, } unsafe impl Send for NoGeneric {} pub struct MultiField { field1: T, field2: T, field3: T, } unsafe impl Send for MultiField {} pub enum MyOption { MySome(T), MyNone, } unsafe impl Send for MyOption {} // Test types that contain `NonNull` instead of raw pointers (#8045) pub struct WrappedNonNull(UnsafeCell>); unsafe impl Send for WrappedNonNull {} // Multiple type parameters pub struct MultiParam { vec: Vec<(A, B)>, } unsafe impl Send for MultiParam {} // Tests for raw pointer heuristic extern "C" { type NonSend; } pub struct HeuristicTest { // raw pointers are allowed field1: Vec<*const NonSend>, field2: [*const NonSend; 3], field3: (*const NonSend, *const NonSend, *const NonSend), // not allowed when it contains concrete `!Send` field field4: (*const NonSend, Rc), // nested raw pointer is also allowed field5: Vec>, } unsafe impl Send for HeuristicTest {} // Test attributes #[allow(clippy::non_send_fields_in_send_ty)] pub struct AttrTest1(T); pub struct AttrTest2 { #[allow(clippy::non_send_fields_in_send_ty)] field: T, } pub enum AttrTest3 { #[allow(clippy::non_send_fields_in_send_ty)] Enum1(T), Enum2(T), } unsafe impl Send for AttrTest1 {} unsafe impl Send for AttrTest2 {} unsafe impl Send for AttrTest3 {} // Multiple non-overlapping `Send` for a single type pub struct Complex { field1: A, field2: B, } unsafe impl

Send for Complex {} // `MutexGuard` is non-Send unsafe impl Send for Complex> {} fn main() {}