rust-ipfs/vendor/pin-project/tests/proper_unpin.rs
Vladislav Tsarev 3dec7eeb01 Initial commit
2024-10-18 11:36:33 +03:00

155 lines
2.9 KiB
Rust

// SPDX-License-Identifier: Apache-2.0 OR MIT
#![allow(dead_code)]
#[macro_use]
mod auxiliary;
pub mod default {
use std::marker::PhantomPinned;
use pin_project::pin_project;
struct Inner<T> {
f: T,
}
assert_unpin!(Inner<()>);
assert_not_unpin!(Inner<PhantomPinned>);
#[pin_project]
struct Struct<T, U> {
#[pin]
f1: Inner<T>,
f2: U,
}
assert_unpin!(Struct<(), ()>);
assert_unpin!(Struct<(), PhantomPinned>);
assert_not_unpin!(Struct<PhantomPinned, ()>);
assert_not_unpin!(Struct<PhantomPinned, PhantomPinned>);
#[pin_project(project = EnumProj, project_ref = EnumProjRef)]
enum Enum<T, U> {
V1 {
#[pin]
f1: Inner<T>,
f2: U,
},
}
assert_unpin!(Enum<(), ()>);
assert_unpin!(Enum<(), PhantomPinned>);
assert_not_unpin!(Enum<PhantomPinned, ()>);
assert_not_unpin!(Enum<PhantomPinned, PhantomPinned>);
#[pin_project]
struct TrivialBounds {
#[pin]
f: PhantomPinned,
}
assert_not_unpin!(TrivialBounds);
#[pin_project]
struct PinRef<'a, T, U> {
#[pin]
f1: &'a mut Inner<T>,
f2: U,
}
assert_unpin!(PinRef<'_, PhantomPinned, PhantomPinned>);
}
pub mod cfg {
use std::marker::PhantomPinned;
use pin_project::pin_project;
#[pin_project]
struct Foo<T> {
#[cfg(any())]
#[pin]
f: T,
#[cfg(not(any()))]
f: T,
}
assert_unpin!(Foo<PhantomPinned>);
#[pin_project]
struct Bar<T> {
#[cfg(any())]
f: T,
#[cfg(not(any()))]
#[pin]
f: T,
}
assert_unpin!(Bar<()>);
assert_not_unpin!(Bar<PhantomPinned>);
}
pub mod cfg_attr {
use std::marker::PhantomPinned;
use pin_project::pin_project;
#[cfg_attr(any(), pin_project)]
struct Foo<T> {
f: T,
}
assert_unpin!(Foo<()>);
assert_not_unpin!(Foo<PhantomPinned>);
#[cfg_attr(not(any()), pin_project)]
struct Bar<T> {
#[cfg_attr(not(any()), pin)]
f: T,
}
assert_unpin!(Bar<()>);
assert_not_unpin!(Bar<PhantomPinned>);
}
// pin_project(!Unpin)
pub mod not_unpin {
use std::marker::PhantomPinned;
use pin_project::pin_project;
struct Inner<T> {
f: T,
}
#[pin_project(!Unpin)]
struct Struct<T, U> {
#[pin]
inner: Inner<T>,
other: U,
}
assert_not_unpin!(Struct<(), ()>);
assert_not_unpin!(Struct<(), PhantomPinned>);
assert_not_unpin!(Struct<PhantomPinned, ()>);
assert_not_unpin!(Struct<PhantomPinned, PhantomPinned>);
#[pin_project(!Unpin)]
struct TrivialBounds {
#[pin]
f: PhantomPinned,
}
assert_not_unpin!(TrivialBounds);
#[pin_project(!Unpin)]
struct PinRef<'a, T, U> {
#[pin]
inner: &'a mut Inner<T>,
other: U,
}
assert_not_unpin!(PinRef<'_, (), ()>);
}