Vendor dependencies for 0.3.0 release

This commit is contained in:
2025-09-27 10:29:08 -05:00
parent 0c8d39d483
commit 82ab7f317b
26803 changed files with 16134934 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![allow(dead_code, unused_macros)]
macro_rules! assert_unpin {
($ty:ty) => {
static_assertions::assert_impl_all!($ty: Unpin);
};
}
macro_rules! assert_not_unpin {
($ty:ty) => {
static_assertions::assert_not_impl_all!($ty: Unpin);
};
}

View File

@@ -0,0 +1,11 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![cfg(not(miri))]
#[rustversion::attr(not(nightly), ignore)]
#[test]
fn ui() {
let t = trybuild::TestCases::new();
t.compile_fail("tests/ui/**/*.rs");
t.pass("tests/run-pass/**/*.rs");
}

View File

@@ -0,0 +1,169 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
// Refs: https://doc.rust-lang.org/reference/destructors.html
use std::{cell::Cell, panic, pin::Pin, thread};
use pin_project_lite::pin_project;
struct D<'a>(&'a Cell<usize>, usize);
impl Drop for D<'_> {
fn drop(&mut self) {
if !thread::panicking() {
let old = self.0.replace(self.1);
assert_eq!(old, self.1 - 1);
}
}
}
pin_project! {
#[project = StructPinnedProj]
#[project_ref = StructPinnedProjRef]
#[project_replace = StructPinnedProjReplace]
struct StructPinned<'a> {
#[pin]
f1: D<'a>,
#[pin]
f2: D<'a>,
}
}
pin_project! {
#[project = StructUnpinnedProj]
#[project_ref = StructUnpinnedProjRef]
#[project_replace = StructUnpinnedProjReplace]
struct StructUnpinned<'a> {
f1: D<'a>,
f2: D<'a>,
}
}
pin_project! {
#[project_replace = EnumProjReplace]
enum Enum<'a> {
#[allow(dead_code)] // false positive that fixed in Rust 1.38
StructPinned {
#[pin]
f1: D<'a>,
#[pin]
f2: D<'a>,
},
#[allow(dead_code)] // false positive that fixed in Rust 1.38
StructUnpinned {
f1: D<'a>,
f2: D<'a>,
},
}
}
#[test]
fn struct_pinned() {
{
let c = Cell::new(0);
let _x = StructPinned { f1: D(&c, 1), f2: D(&c, 2) };
}
{
let c = Cell::new(0);
let mut x = StructPinned { f1: D(&c, 1), f2: D(&c, 2) };
let y = Pin::new(&mut x);
let _z = y.project_replace(StructPinned { f1: D(&c, 3), f2: D(&c, 4) });
}
}
#[test]
fn struct_unpinned() {
{
let c = Cell::new(0);
let _x = StructUnpinned { f1: D(&c, 1), f2: D(&c, 2) };
}
{
let c = Cell::new(0);
let mut x = StructUnpinned { f1: D(&c, 1), f2: D(&c, 2) };
let y = Pin::new(&mut x);
let _z = y.project_replace(StructUnpinned { f1: D(&c, 3), f2: D(&c, 4) });
}
}
#[test]
fn enum_struct() {
{
let c = Cell::new(0);
let _x = Enum::StructPinned { f1: D(&c, 1), f2: D(&c, 2) };
}
{
let c = Cell::new(0);
let mut x = Enum::StructPinned { f1: D(&c, 1), f2: D(&c, 2) };
let y = Pin::new(&mut x);
let _z = y.project_replace(Enum::StructPinned { f1: D(&c, 3), f2: D(&c, 4) });
}
{
let c = Cell::new(0);
let _x = Enum::StructUnpinned { f1: D(&c, 1), f2: D(&c, 2) };
}
{
let c = Cell::new(0);
let mut x = Enum::StructUnpinned { f1: D(&c, 1), f2: D(&c, 2) };
let y = Pin::new(&mut x);
let _z = y.project_replace(Enum::StructUnpinned { f1: D(&c, 3), f2: D(&c, 4) });
}
}
// https://github.com/rust-lang/rust/issues/47949
// https://github.com/taiki-e/pin-project/pull/194#discussion_r419098111
#[allow(clippy::many_single_char_names)]
#[test]
fn project_replace_panic() {
pin_project! {
#[project_replace = SProjReplace]
struct S<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
struct D<'a>(&'a mut bool, bool);
impl Drop for D<'_> {
fn drop(&mut self) {
*self.0 = true;
if self.1 {
panic!();
}
}
}
let (mut a, mut b, mut c, mut d) = (false, false, false, false);
let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
let mut x = S { pinned: D(&mut a, true), unpinned: D(&mut b, false) };
let _y = Pin::new(&mut x)
.project_replace(S { pinned: D(&mut c, false), unpinned: D(&mut d, false) });
// Previous `x.pinned` was dropped and panicked when `project_replace` is
// called, so this is unreachable.
unreachable!();
}));
assert!(res.is_err());
assert!(a);
assert!(b);
assert!(c);
assert!(d);
let (mut a, mut b, mut c, mut d) = (false, false, false, false);
let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
let mut x = S { pinned: D(&mut a, false), unpinned: D(&mut b, true) };
{
let _y = Pin::new(&mut x)
.project_replace(S { pinned: D(&mut c, false), unpinned: D(&mut d, false) });
// `_y` (previous `x.unpinned`) live to the end of this scope, so
// this is not unreachable.
// unreachable!();
}
unreachable!();
}));
assert!(res.is_err());
assert!(a);
assert!(b);
assert!(c);
assert!(d);
}

View File

@@ -0,0 +1,166 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProj<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjRef<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjReplace<T, U> {
Struct { pinned: ::pin_project_lite::__private::PhantomData<T>, unpinned: U },
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> EnumProj<'__pin, T, U> {
unsafe {
match self.get_unchecked_mut() {
Self::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> EnumProjRef<'__pin, T, U> {
unsafe {
match self.get_ref() {
Self::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
}
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
) -> EnumProjReplace<T, U> {
unsafe {
let __self_ptr: *mut Self = self.get_unchecked_mut();
let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard::new(
__self_ptr,
replacement,
);
match &mut *__self_ptr {
Self::Struct { pinned, unpinned } => {
let result = EnumProjReplace::Struct {
pinned: ::pin_project_lite::__private::PhantomData,
unpinned: ::pin_project_lite::__private::ptr::read(unpinned),
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned,
),
(),
);
}
result
}
Self::Unit => EnumProjReplace::Unit,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,19 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[project_replace = EnumProjReplace]
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,107 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct Projection<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct ProjectionRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> Projection<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
Projection {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
ProjectionRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,13 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,102 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned1: T, pinned2: T, unpinned1: U, unpinned2: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjReplace<T, U> {
Struct {
pinned1: ::pin_project_lite::__private::PhantomData<T>,
pinned2: ::pin_project_lite::__private::PhantomData<T>,
unpinned1: U,
unpinned2: U,
},
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
) -> EnumProjReplace<T, U> {
unsafe {
let __self_ptr: *mut Self = self.get_unchecked_mut();
let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard::new(
__self_ptr,
replacement,
);
match &mut *__self_ptr {
Self::Struct { pinned1, pinned2, unpinned1, unpinned2 } => {
let result = EnumProjReplace::Struct {
pinned1: ::pin_project_lite::__private::PhantomData,
pinned2: ::pin_project_lite::__private::PhantomData,
unpinned1: ::pin_project_lite::__private::ptr::read(
unpinned1,
),
unpinned2: ::pin_project_lite::__private::ptr::read(
unpinned2,
),
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned1,
),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned2,
),
(),
(),
);
}
result
}
Self::Unit => EnumProjReplace::Unit,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (
T,
T,
::pin_project_lite::__private::AlwaysUnpin<U>,
::pin_project_lite::__private::AlwaysUnpin<U>,
),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,20 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project_replace = EnumProjReplace]
enum Enum<T, U> {
Struct {
#[pin]
pinned1: T,
#[pin]
pinned2: T,
unpinned1: U,
unpinned2: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,174 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned1: T,
pinned2: T,
unpinned1: U,
unpinned2: U,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProjReplace<T, U> {
pinned1: ::pin_project_lite::__private::PhantomData<T>,
pinned2: ::pin_project_lite::__private::PhantomData<T>,
unpinned1: U,
unpinned2: U,
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct Projection<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned1: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
pinned2: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned1: &'__pin mut (U),
unpinned2: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct ProjectionRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned1: ::pin_project_lite::__private::Pin<&'__pin (T)>,
pinned2: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned1: &'__pin (U),
unpinned2: &'__pin (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> Projection<'__pin, T, U> {
unsafe {
let Self { pinned1, pinned2, unpinned1, unpinned2 } = self
.get_unchecked_mut();
Projection {
pinned1: ::pin_project_lite::__private::Pin::new_unchecked(pinned1),
pinned2: ::pin_project_lite::__private::Pin::new_unchecked(pinned2),
unpinned1: unpinned1,
unpinned2: unpinned2,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
unsafe {
let Self { pinned1, pinned2, unpinned1, unpinned2 } = self.get_ref();
ProjectionRef {
pinned1: ::pin_project_lite::__private::Pin::new_unchecked(pinned1),
pinned2: ::pin_project_lite::__private::Pin::new_unchecked(pinned2),
unpinned1: unpinned1,
unpinned2: unpinned2,
}
}
}
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
) -> StructProjReplace<T, U> {
unsafe {
let __self_ptr: *mut Self = self.get_unchecked_mut();
let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard::new(
__self_ptr,
replacement,
);
let Self { pinned1, pinned2, unpinned1, unpinned2 } = &mut *__self_ptr;
let result = StructProjReplace {
pinned1: ::pin_project_lite::__private::PhantomData,
pinned2: ::pin_project_lite::__private::PhantomData,
unpinned1: ::pin_project_lite::__private::ptr::read(unpinned1),
unpinned2: ::pin_project_lite::__private::ptr::read(unpinned2),
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned1,
),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned2,
),
(),
(),
);
}
result
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned1: T,
pinned2: T,
unpinned1: ::pin_project_lite::__private::AlwaysUnpin<U>,
unpinned2: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned1;
let _ = &this.pinned2;
let _ = &this.unpinned1;
let _ = &this.unpinned2;
}
};
fn main() {}

View File

@@ -0,0 +1,17 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project_replace = StructProjReplace]
struct Struct<T, U> {
#[pin]
pinned1: T,
#[pin]
pinned2: T,
unpinned1: U,
unpinned2: U,
}
}
fn main() {}

View File

@@ -0,0 +1,166 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProj<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjRef<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjReplace<T, U> {
Struct { pinned: ::pin_project_lite::__private::PhantomData<T>, unpinned: U },
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> EnumProj<'__pin, T, U> {
unsafe {
match self.get_unchecked_mut() {
Self::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> EnumProjRef<'__pin, T, U> {
unsafe {
match self.get_ref() {
Self::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
}
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
) -> EnumProjReplace<T, U> {
unsafe {
let __self_ptr: *mut Self = self.get_unchecked_mut();
let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard::new(
__self_ptr,
replacement,
);
match &mut *__self_ptr {
Self::Struct { pinned, unpinned } => {
let result = EnumProjReplace::Struct {
pinned: ::pin_project_lite::__private::PhantomData,
unpinned: ::pin_project_lite::__private::ptr::read(unpinned),
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned,
),
(),
);
}
result
}
Self::Unit => EnumProjReplace::Unit,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,19 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[project_replace = EnumProjReplace]
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,76 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProj<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
},
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> EnumProj<'__pin, T, U> {
unsafe {
match self.get_unchecked_mut() {
Self::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,17 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,33 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,16 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,76 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjRef<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
},
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> EnumProjRef<'__pin, T, U> {
unsafe {
match self.get_ref() {
Self::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,17 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project_ref = EnumProjRef]
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,151 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProj<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProjRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProjReplace<T, U> {
pinned: ::pin_project_lite::__private::PhantomData<T>,
unpinned: U,
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> StructProj<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
StructProj {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> StructProjRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
StructProjRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
) -> StructProjReplace<T, U> {
unsafe {
let __self_ptr: *mut Self = self.get_unchecked_mut();
let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard::new(
__self_ptr,
replacement,
);
let Self { pinned, unpinned } = &mut *__self_ptr;
let result = StructProjReplace {
pinned: ::pin_project_lite::__private::PhantomData,
unpinned: ::pin_project_lite::__private::ptr::read(unpinned),
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned,
),
(),
);
}
result
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,16 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = StructProj]
#[project_ref = StructProjRef]
#[project_replace = StructProjReplace]
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,107 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProj<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct ProjectionRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> StructProj<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
StructProj {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
ProjectionRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = StructProj]
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,107 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct Projection<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct ProjectionRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> Projection<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
Projection {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
ProjectionRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,13 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,107 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProjRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct Projection<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> Projection<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
Projection {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> StructProjRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
StructProjRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project_ref = StructProjRef]
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,114 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProj<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjRef<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
},
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> EnumProj<'__pin, T, U> {
unsafe {
match self.get_unchecked_mut() {
Self::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> EnumProjRef<'__pin, T, U> {
unsafe {
match self.get_ref() {
Self::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
}
}
#[doc(hidden)]
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
(
::pin_project_lite::__private::PhantomData<&'__pin ()>,
::pin_project_lite::__private::PhantomPinned,
): ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,19 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project(!Unpin)]
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,103 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProj<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct StructProjRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> StructProj<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
StructProj {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> StructProjRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
StructProjRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[doc(hidden)]
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
(
::pin_project_lite::__private::PhantomData<&'__pin ()>,
::pin_project_lite::__private::PhantomPinned,
): ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,16 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = StructProj]
#[project(!Unpin)]
#[project_ref = StructProjRef]
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,128 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProj<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
enum EnumProjRef<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
},
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> EnumProj<'__pin, T, U> {
unsafe {
match self.get_unchecked_mut() {
Self::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> EnumProjRef<'__pin, T, U> {
unsafe {
match self.get_ref() {
Self::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
impl<T, U> ::pin_project_lite::__private::Drop for Enum<T, U> {
fn drop(&mut self) {
fn __drop_inner<T, U>(
this: ::pin_project_lite::__private::Pin<&mut Enum<T, U>>,
) {
fn __drop_inner() {}
let _ = this;
}
let pinned_self: ::pin_project_lite::__private::Pin<&mut Self> = unsafe {
::pin_project_lite::__private::Pin::new_unchecked(self)
};
__drop_inner(pinned_self);
}
}
};
fn main() {}

View File

@@ -0,0 +1,23 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
impl<T, U> PinnedDrop for Enum<T, U> {
fn drop(this: Pin<&mut Self>) {
let _ = this;
}
}
}
fn main() {}

View File

@@ -0,0 +1,117 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct Projection<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
struct ProjectionRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> Projection<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
Projection {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
ProjectionRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[allow(non_snake_case)]
struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
impl<T, U> ::pin_project_lite::__private::Drop for Struct<T, U> {
fn drop(&mut self) {
fn __drop_inner<T, U>(
this: ::pin_project_lite::__private::Pin<&mut Struct<T, U>>,
) {
fn __drop_inner() {}
let _ = this;
}
let pinned_self: ::pin_project_lite::__private::Pin<&mut Self> = unsafe {
::pin_project_lite::__private::Pin::new_unchecked(self)
};
__drop_inner(pinned_self);
}
}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,18 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
impl<T, U> PinnedDrop for Struct<T, U> {
fn drop(this: Pin<&mut Self>) {
let _ = this;
}
}
}
fn main() {}

View File

@@ -0,0 +1,118 @@
use pin_project_lite::pin_project;
pub enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
pub(crate) enum EnumProj<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
},
Unit,
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
pub(crate) enum EnumProjRef<'__pin, T, U>
where
Enum<T, U>: '__pin,
{
Struct {
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
},
Unit,
}
#[allow(
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
impl<T, U> Enum<T, U> {
#[doc(hidden)]
#[inline]
pub(crate) fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> EnumProj<'__pin, T, U> {
unsafe {
match self.get_unchecked_mut() {
Self::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
}
#[doc(hidden)]
#[inline]
pub(crate) fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> EnumProjRef<'__pin, T, U> {
unsafe {
match self.get_ref() {
Self::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
}
}
#[allow(non_snake_case)]
pub struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Enum<T, U> {}
};
fn main() {}

View File

@@ -0,0 +1,18 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
pub enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
fn main() {}

View File

@@ -0,0 +1,107 @@
use pin_project_lite::pin_project;
pub struct Struct<T, U> {
pub pinned: T,
pub unpinned: U,
}
#[allow(
explicit_outlives_requirements,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::redundant_pub_crate,
clippy::single_char_lifetime_names,
clippy::used_underscore_binding
)]
const _: () = {
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
pub(crate) struct Projection<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pub pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
pub unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(
dead_code,
single_use_lifetimes,
clippy::unknown_clippy_lints,
clippy::absolute_paths,
clippy::min_ident_chars,
clippy::mut_mut,
clippy::redundant_pub_crate,
clippy::ref_option_ref,
clippy::single_char_lifetime_names,
clippy::type_repetition_in_bounds
)]
pub(crate) struct ProjectionRef<'__pin, T, U>
where
Struct<T, U>: '__pin,
{
pub pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
pub unpinned: &'__pin (U),
}
impl<T, U> Struct<T, U> {
#[doc(hidden)]
#[inline]
pub(crate) fn project<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin mut Self>,
) -> Projection<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
Projection {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
#[doc(hidden)]
#[inline]
pub(crate) fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
ProjectionRef {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned),
unpinned: unpinned,
}
}
}
}
#[allow(non_snake_case)]
pub struct __Origin<'__pin, T, U> {
__dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>,
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
::pin_project_lite::__private::PinnedFieldsOf<
__Origin<'__pin, T, U>,
>: ::pin_project_lite::__private::Unpin,
{}
trait MustNotImplDrop {}
#[allow(clippy::drop_bounds, drop_bounds)]
impl<T: ::pin_project_lite::__private::Drop> MustNotImplDrop for T {}
impl<T, U> MustNotImplDrop for Struct<T, U> {}
#[forbid(unaligned_references, safe_packed_borrows)]
fn __assert_not_repr_packed<T, U>(this: &Struct<T, U>) {
let _ = &this.pinned;
let _ = &this.unpinned;
}
};
fn main() {}

View File

@@ -0,0 +1,13 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
pub struct Struct<T, U> {
#[pin]
pub pinned: T,
pub unpinned: U,
}
}
fn main() {}

View File

@@ -0,0 +1,10 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![cfg(not(miri))]
#[rustversion::attr(not(nightly), ignore)]
#[test]
fn expandtest() {
let args = &["--all-features"];
macrotest::expand_args("tests/expand/**/*.rs", args);
}

View File

@@ -0,0 +1,81 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
// default pin_project! is completely safe.
::pin_project_lite::pin_project! {
/// Testing default struct.
#[derive(Debug)]
#[allow(clippy::exhaustive_structs)] // for the type itself
pub struct DefaultStruct<T, U> {
#[pin]
pub pinned: T,
pub unpinned: U,
}
}
::pin_project_lite::pin_project! {
/// Testing named struct.
#[allow(clippy::exhaustive_structs)] // for the type itself
#[project = DefaultStructProj]
#[project_ref = DefaultStructProjRef]
#[derive(Debug)]
pub struct DefaultStructNamed<T, U> {
#[pin]
pub pinned: T,
pub unpinned: U,
}
}
::pin_project_lite::pin_project! {
/// Testing enum.
#[allow(clippy::exhaustive_enums)] // for the type itself
#[project = DefaultEnumProj]
#[project_ref = DefaultEnumProjRef]
#[derive(Debug)]
pub enum DefaultEnum<T, U> {
/// Struct variant.
Struct {
#[pin]
pinned: T,
unpinned: U,
},
/// Unit variant.
Unit,
}
}
::pin_project_lite::pin_project! {
/// Testing pinned drop struct.
#[allow(clippy::exhaustive_structs)] // for the type itself
#[derive(Debug)]
pub struct PinnedDropStruct<T, U> {
#[pin]
pub pinned: T,
pub unpinned: U,
}
impl<T, U> PinnedDrop for PinnedDropStruct<T, U> {
fn drop(_this: Pin<&mut Self>) {}
}
}
::pin_project_lite::pin_project! {
/// Testing pinned drop enum.
#[allow(clippy::absolute_paths, clippy::exhaustive_enums)] // for the type itself
#[project = PinnedDropEnumProj]
#[project_ref = PinnedDropEnumProjRef]
#[derive(Debug)]
pub enum PinnedDropEnum<T: ::pin_project_lite::__private::Unpin, U> {
/// Struct variant.
Struct {
#[pin]
pinned: T,
unpinned: U,
},
/// Unit variant.
Unit,
}
#[allow(clippy::absolute_paths)]
impl<T: ::pin_project_lite::__private::Unpin, U> PinnedDrop for PinnedDropEnum<T, U> {
fn drop(_this: Pin<&mut Self>) {}
}
}

View File

@@ -0,0 +1,101 @@
// 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_lite::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! {
#[project(!Unpin)]
enum NotUnpinEnum<T, U> {
V1 {
#[pin] f1: Inner<T>,
f2: U,
}
}
}
assert_not_unpin!(NotUnpinEnum<(), ()>);
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>);
pin_project! {
#[project(!Unpin)]
struct NotUnpin<U> {
#[pin]
u: U
}
}
assert_not_unpin!(NotUnpin<()>);
pin_project! {
#[project(!Unpin)]
struct NotUnpinRef<'a, T, U> {
#[pin]
f1: &'a mut Inner<T>,
f2: U
}
}
assert_not_unpin!(NotUnpinRef<'_, (), ()>);
}

699
vendor/pin-project-lite/tests/test.rs vendored Normal file
View File

@@ -0,0 +1,699 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![allow(dead_code, unreachable_pub, clippy::no_effect_underscore_binding)]
#[macro_use]
mod auxiliary;
use core::{
marker::{PhantomData, PhantomPinned},
pin::Pin,
};
use pin_project_lite::pin_project;
#[test]
fn projection() {
pin_project! {
#[project = StructProj]
#[project_ref = StructProjRef]
#[project_replace = StructProjReplace]
#[derive(Default)]
struct Struct<T, U> {
#[pin]
f1: T,
f2: U,
}
}
let mut s = Struct { f1: 1, f2: 2 };
let mut s_orig = Pin::new(&mut s);
let s = s_orig.as_mut().project();
let _: Pin<&mut i32> = s.f1;
assert_eq!(*s.f1, 1);
let _: &mut i32 = s.f2;
assert_eq!(*s.f2, 2);
assert_eq!(s_orig.as_ref().f1, 1);
assert_eq!(s_orig.as_ref().f2, 2);
let mut s = Struct { f1: 1, f2: 2 };
let mut s = Pin::new(&mut s);
{
let StructProj { f1, f2 } = s.as_mut().project();
let _: Pin<&mut i32> = f1;
let _: &mut i32 = f2;
}
{
let StructProjRef { f1, f2 } = s.as_ref().project_ref();
let _: Pin<&i32> = f1;
let _: &i32 = f2;
}
{
let StructProjReplace { f1: PhantomData, f2 } =
s.as_mut().project_replace(Struct::default());
assert_eq!(f2, 2);
let StructProj { f1, f2 } = s.project();
assert_eq!(*f1, 0);
assert_eq!(*f2, 0);
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[project_replace = EnumProjReplace]
#[derive(Eq, PartialEq, Debug)]
enum Enum<C, D> {
Struct {
#[pin]
f1: C,
f2: D,
},
Unit,
}
}
let mut e = Enum::Struct { f1: 1, f2: 2 };
let mut e = Pin::new(&mut e);
match e.as_mut().project() {
EnumProj::Struct { f1, f2 } => {
let _: Pin<&mut i32> = f1;
assert_eq!(*f1, 1);
let _: &mut i32 = f2;
assert_eq!(*f2, 2);
}
EnumProj::Unit => unreachable!(),
}
assert_eq!(&*e, &Enum::Struct { f1: 1, f2: 2 });
if let EnumProj::Struct { f1, f2 } = e.as_mut().project() {
let _: Pin<&mut i32> = f1;
assert_eq!(*f1, 1);
let _: &mut i32 = f2;
assert_eq!(*f2, 2);
}
if let EnumProjReplace::Struct { f1: PhantomData, f2 } = e.as_mut().project_replace(Enum::Unit)
{
assert_eq!(f2, 2);
}
}
#[test]
fn enum_project_set() {
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Eq, PartialEq, Debug)]
enum Enum {
V1 { #[pin] f: u8 },
V2 { f: bool },
}
}
let mut e = Enum::V1 { f: 25 };
let mut e_orig = Pin::new(&mut e);
let e_proj = e_orig.as_mut().project();
match e_proj {
EnumProj::V1 { f } => {
let new_e = Enum::V2 { f: f.as_ref().get_ref() == &25 };
e_orig.set(new_e);
}
EnumProj::V2 { .. } => unreachable!(),
}
assert_eq!(e, Enum::V2 { f: true });
}
#[test]
fn where_clause() {
pin_project! {
struct Struct<T>
where
T: Copy,
{
f: T,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum<T>
where
T: Copy,
{
V { f: T },
}
}
}
#[test]
fn where_clause_and_associated_type_field() {
pin_project! {
struct Struct1<I>
where
I: Iterator,
{
#[pin]
f1: I,
f2: I::Item,
}
}
pin_project! {
struct Struct2<I, J>
where
I: Iterator<Item = J>,
{
#[pin]
f1: I,
f2: J,
}
}
pin_project! {
pub struct Struct3<T>
where
T: 'static,
{
f: T,
}
}
trait Static: 'static {}
impl<T> Static for Struct3<T> {}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum<I>
where
I: Iterator,
{
V1 { #[pin] f: I },
V2 { f: I::Item },
}
}
}
#[test]
fn derive_copy() {
pin_project! {
#[derive(Clone, Copy)]
struct Struct<T> {
f: T,
}
}
fn is_copy<T: Copy>() {}
is_copy::<Struct<u8>>();
}
#[test]
fn move_out() {
struct NotCopy;
pin_project! {
struct Struct {
f: NotCopy,
}
}
let x = Struct { f: NotCopy };
let _val: NotCopy = x.f;
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum {
V { f: NotCopy },
}
}
let x = Enum::V { f: NotCopy };
#[allow(clippy::infallible_destructuring_match)]
let _val: NotCopy = match x {
Enum::V { f } => f,
};
}
#[test]
fn trait_bounds_on_type_generics() {
pin_project! {
pub struct Struct1<'a, T: ?Sized> {
f: &'a mut T,
}
}
pin_project! {
pub struct Struct2<'a, T: ::core::fmt::Debug> {
f: &'a mut T,
}
}
pin_project! {
pub struct Struct3<'a, T: core::fmt::Debug> {
f: &'a mut T,
}
}
// pin_project! {
// pub struct Struct4<'a, T: core::fmt::Debug + core::fmt::Display> {
// f: &'a mut T,
// }
// }
// pin_project! {
// pub struct Struct5<'a, T: core::fmt::Debug + ?Sized> {
// f: &'a mut T,
// }
// }
pin_project! {
pub struct Struct6<'a, T: core::fmt::Debug = [u8; 16]> {
f: &'a mut T,
}
}
let _: Struct6<'_> = Struct6 { f: &mut [0_u8; 16] };
pin_project! {
pub struct Struct7<T: 'static> {
f: T,
}
}
trait Static: 'static {}
impl<T> Static for Struct7<T> {}
pin_project! {
pub struct Struct8<'a, 'b: 'a> {
f1: &'a u8,
f2: &'b u8,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum<'a, T: ?Sized> {
V { f: &'a mut T },
}
}
}
#[test]
fn private_type_in_public_type() {
pin_project! {
pub struct PublicStruct<T> {
#[pin]
inner: PrivateStruct<T>,
}
}
struct PrivateStruct<T>(T);
}
#[allow(clippy::needless_lifetimes)]
#[test]
fn lifetime_project() {
pin_project! {
struct Struct1<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
pin_project! {
struct Struct2<'a, T, U> {
#[pin]
pinned: &'a T,
unpinned: U,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
enum Enum<T, U> {
V {
#[pin]
pinned: T,
unpinned: U,
},
}
}
impl<T, U> Struct1<T, U> {
fn get_pin_ref<'a>(self: Pin<&'a Self>) -> Pin<&'a T> {
self.project_ref().pinned
}
fn get_pin_mut<'a>(self: Pin<&'a mut Self>) -> Pin<&'a mut T> {
self.project().pinned
}
fn get_pin_ref_elided(self: Pin<&Self>) -> Pin<&T> {
self.project_ref().pinned
}
fn get_pin_mut_elided(self: Pin<&mut Self>) -> Pin<&mut T> {
self.project().pinned
}
}
impl<'b, T, U> Struct2<'b, T, U> {
fn get_pin_ref<'a>(self: Pin<&'a Self>) -> Pin<&'a &'b T> {
self.project_ref().pinned
}
fn get_pin_mut<'a>(self: Pin<&'a mut Self>) -> Pin<&'a mut &'b T> {
self.project().pinned
}
fn get_pin_ref_elided(self: Pin<&Self>) -> Pin<&&'b T> {
self.project_ref().pinned
}
fn get_pin_mut_elided(self: Pin<&mut Self>) -> Pin<&mut &'b T> {
self.project().pinned
}
}
impl<T, U> Enum<T, U> {
fn get_pin_ref<'a>(self: Pin<&'a Self>) -> Pin<&'a T> {
match self.project_ref() {
EnumProjRef::V { pinned, .. } => pinned,
}
}
fn get_pin_mut<'a>(self: Pin<&'a mut Self>) -> Pin<&'a mut T> {
match self.project() {
EnumProj::V { pinned, .. } => pinned,
}
}
fn get_pin_ref_elided(self: Pin<&Self>) -> Pin<&T> {
match self.project_ref() {
EnumProjRef::V { pinned, .. } => pinned,
}
}
fn get_pin_mut_elided(self: Pin<&mut Self>) -> Pin<&mut T> {
match self.project() {
EnumProj::V { pinned, .. } => pinned,
}
}
}
}
mod visibility {
use pin_project_lite::pin_project;
pin_project! {
pub(crate) struct S {
pub f: u8,
}
}
}
#[test]
fn visibility() {
let mut x = visibility::S { f: 0 };
let x = Pin::new(&mut x);
let y = x.as_ref().project_ref();
let _: &u8 = y.f;
let y = x.project();
let _: &mut u8 = y.f;
}
#[test]
fn trivial_bounds() {
pin_project! {
pub struct NoGenerics {
#[pin]
f: PhantomPinned,
}
}
assert_not_unpin!(NoGenerics);
}
#[test]
fn dst() {
pin_project! {
pub struct Struct1<T: ?Sized> {
f: T,
}
}
let mut x = Struct1 { f: 0_u8 };
let x: Pin<&mut Struct1<dyn core::fmt::Debug>> = Pin::new(&mut x);
let _: &mut (dyn core::fmt::Debug) = x.project().f;
pin_project! {
pub struct Struct2<T: ?Sized> {
#[pin]
f: T,
}
}
let mut x = Struct2 { f: 0_u8 };
let x: Pin<&mut Struct2<dyn core::fmt::Debug + Unpin>> = Pin::new(&mut x);
let _: Pin<&mut (dyn core::fmt::Debug + Unpin)> = x.project().f;
pin_project! {
struct Struct3<T>
where
T: ?Sized,
{
f: T,
}
}
pin_project! {
struct Struct4<T>
where
T: ?Sized,
{
#[pin]
f: T,
}
}
pin_project! {
struct Struct11<'a, T: ?Sized, U: ?Sized> {
f1: &'a mut T,
f2: U,
}
}
}
#[test]
fn dyn_type() {
pin_project! {
struct Struct1 {
f: dyn core::fmt::Debug,
}
}
pin_project! {
struct Struct2 {
#[pin]
f: dyn core::fmt::Debug,
}
}
pin_project! {
struct Struct3 {
f: dyn core::fmt::Debug + Send,
}
}
pin_project! {
struct Struct4 {
#[pin]
f: dyn core::fmt::Debug + Send,
}
}
}
#[test]
fn no_infer_outlives() {
trait Trait<X> {
type Y;
}
struct Struct1<A>(A);
impl<X, T> Trait<X> for Struct1<T> {
type Y = Option<T>;
}
pin_project! {
struct Struct2<A, B> {
_f: <Struct1<A> as Trait<B>>::Y,
}
}
}
// https://github.com/taiki-e/pin-project-lite/issues/31
#[test]
fn trailing_comma() {
pub trait T {}
pin_project! {
pub struct S1<
A: T,
B: T,
> {
f: (A, B),
}
}
pin_project! {
pub struct S2<
A,
B,
>
where
A: T,
B: T,
{
f: (A, B),
}
}
pin_project! {
#[allow(explicit_outlives_requirements)]
pub struct S3<
'a,
A: 'a,
B: 'a,
> {
f: &'a (A, B),
}
}
// pin_project! {
// pub struct S4<
// 'a,
// 'b: 'a, // <-----
// > {
// f: &'a &'b (),
// }
// }
}
#[test]
fn attrs() {
pin_project! {
/// dox1
#[derive(Clone)]
#[project = StructProj]
#[project_ref = StructProjRef]
/// dox2
#[derive(Debug)]
/// dox3
struct Struct {
// TODO
// /// dox4
f: ()
}
}
pin_project! {
#[project = Enum1Proj]
#[project_ref = Enum1ProjRef]
enum Enum1 {
#[cfg(not(any()))]
V {
f: ()
},
}
}
pin_project! {
/// dox1
#[derive(Clone)]
#[project(!Unpin)]
#[project = Enum2Proj]
#[project_ref = Enum2ProjRef]
/// dox2
#[derive(Debug)]
/// dox3
enum Enum2 {
/// dox4
V1 {
// TODO
// /// dox5
f: ()
},
/// dox6
V2,
}
}
}
#[test]
fn pinned_drop() {
pin_project! {
pub struct Struct1<'a> {
was_dropped: &'a mut bool,
#[pin]
field: u8,
}
impl PinnedDrop for Struct1<'_> {
fn drop(this: Pin<&mut Self>) {
**this.project().was_dropped = true;
}
}
}
let mut was_dropped = false;
drop(Struct1 { was_dropped: &mut was_dropped, field: 42 });
assert!(was_dropped);
pin_project! {
pub struct Struct2<'a> {
was_dropped: &'a mut bool,
#[pin]
field: u8,
}
impl PinnedDrop for Struct2<'_> {
fn drop(mut this: Pin<&mut Self>) {
**this.as_mut().project().was_dropped = true;
}
}
}
trait Service<Request> {
type Error;
}
pin_project! {
struct Struct3<'a, T, Request>
where
T: Service<Request>,
T::Error: std::error::Error,
{
was_dropped: &'a mut bool,
#[pin]
field: T,
req: Request,
}
/// dox1
impl<T, Request> PinnedDrop for Struct3<'_, T, Request>
where
T: Service<Request>,
T::Error: std::error::Error,
{
/// dox2
fn drop(mut this: Pin<&mut Self>) {
**this.as_mut().project().was_dropped = true;
}
}
}
}

View File

@@ -0,0 +1,38 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
#[project(!Unpin)]
struct Foo<T, U> {
#[pin]
f1: T,
f2: U,
}
}
impl<T, U> Unpin for Foo<T, U> where T: Unpin {}
pin_project! {
#[project(!Unpin)]
struct Bar<T, U> {
#[pin]
f1: T,
f2: U,
}
}
impl<T, U> Unpin for Bar<T, U> {}
pin_project! {
#[project(!Unpin)]
struct Baz<T, U> {
#[pin]
f1: T,
f2: U,
}
}
impl<T: Unpin, U: Unpin> Unpin for Baz<T, U> {}
fn main() {}

View File

@@ -0,0 +1,50 @@
error[E0119]: conflicting implementations of trait `Unpin` for type `Foo<_, _>`
--> tests/ui/not_unpin/conflict-unpin.rs:5:1
|
5 | / pin_project! {
6 | | #[project(!Unpin)]
7 | | struct Foo<T, U> {
8 | | #[pin]
... |
12 | | }
| |_^ conflicting implementation for `Foo<_, _>`
13 |
14 | impl<T, U> Unpin for Foo<T, U> where T: Unpin {}
| --------------------------------------------- first implementation here
|
= note: upstream crates may add a new impl of trait `std::marker::Unpin` for type `(std::marker::PhantomData<&()>, std::marker::PhantomPinned)` in future versions
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0119]: conflicting implementations of trait `Unpin` for type `Bar<_, _>`
--> tests/ui/not_unpin/conflict-unpin.rs:16:1
|
16 | / pin_project! {
17 | | #[project(!Unpin)]
18 | | struct Bar<T, U> {
19 | | #[pin]
... |
23 | | }
| |_^ conflicting implementation for `Bar<_, _>`
24 |
25 | impl<T, U> Unpin for Bar<T, U> {}
| ------------------------------ first implementation here
|
= note: upstream crates may add a new impl of trait `std::marker::Unpin` for type `(std::marker::PhantomData<&()>, std::marker::PhantomPinned)` in future versions
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0119]: conflicting implementations of trait `Unpin` for type `Baz<_, _>`
--> tests/ui/not_unpin/conflict-unpin.rs:27:1
|
27 | / pin_project! {
28 | | #[project(!Unpin)]
29 | | struct Baz<T, U> {
30 | | #[pin]
... |
34 | | }
| |_^ conflicting implementation for `Baz<_, _>`
35 |
36 | impl<T: Unpin, U: Unpin> Unpin for Baz<T, U> {}
| -------------------------------------------- first implementation here
|
= note: upstream crates may add a new impl of trait `std::marker::Unpin` for type `(std::marker::PhantomData<&()>, std::marker::PhantomPinned)` in future versions
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,22 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
// https://github.com/taiki-e/pin-project/issues/340#issuecomment-2428002670
pin_project_lite::pin_project! {
#[project(!Unpin)]
struct Foo<Pinned, Unpinned> {
#[pin]
pinned: Pinned,
unpinned: Unpinned,
}
}
struct MyPhantomPinned(::core::marker::PhantomPinned);
impl Unpin for MyPhantomPinned where for<'cursed> str: Sized {}
impl Unpin for Foo<MyPhantomPinned, ()> {}
fn is_unpin<T: Unpin>() {}
fn main() {
is_unpin::<Foo<MyPhantomPinned, ()>>()
}

View File

@@ -0,0 +1,16 @@
error[E0119]: conflicting implementations of trait `Unpin` for type `Foo<MyPhantomPinned, ()>`
--> tests/ui/not_unpin/negative_impls_stable.rs:5:1
|
5 | / pin_project_lite::pin_project! {
6 | | #[project(!Unpin)]
7 | | struct Foo<Pinned, Unpinned> {
8 | | #[pin]
... |
12 | | }
| |_^ conflicting implementation for `Foo<MyPhantomPinned, ()>`
...
16 | impl Unpin for Foo<MyPhantomPinned, ()> {}
| --------------------------------------- first implementation here
|
= note: upstream crates may add a new impl of trait `std::marker::Unpin` for type `(std::marker::PhantomData<&()>, std::marker::PhantomPinned)` in future versions
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project_lite::pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,17 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! { //~ ERROR E0119
struct Foo<T, U> {
#[pin]
future: T,
field: U,
}
}
impl<T, U> Drop for Foo<T, U> {
fn drop(&mut self) {}
}
fn main() {}

View File

@@ -0,0 +1,15 @@
error[E0119]: conflicting implementations of trait `MustNotImplDrop` for type `Foo<_, _>`
--> tests/ui/pin_project/conflict-drop.rs:5:1
|
5 | / pin_project! { //~ ERROR E0119
6 | | struct Foo<T, U> {
7 | | #[pin]
8 | | future: T,
... |
11 | | }
| | ^
| | |
| |_first implementation here
| conflicting implementation for `Foo<_, _>`
|
= note: this error originates in the macro `$crate::__pin_project_make_drop_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,66 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
// The same implementation.
pin_project! { //~ ERROR E0119
struct Foo<T, U> {
#[pin]
future: T,
field: U,
}
}
// conflicting implementations
impl<T, U> Unpin for Foo<T, U> where T: Unpin {} // Conditional Unpin impl
// The implementation that under different conditions.
pin_project! { //~ ERROR E0119
struct Bar<T, U> {
#[pin]
future: T,
field: U,
}
}
// conflicting implementations
impl<T, U> Unpin for Bar<T, U> {} // Non-conditional Unpin impl
pin_project! { //~ ERROR E0119
struct Baz<T, U> {
#[pin]
future: T,
field: U,
}
}
// conflicting implementations
impl<T: Unpin, U: Unpin> Unpin for Baz<T, U> {} // Conditional Unpin impl
pin_project! { //~ ERROR E0119
#[project(!Unpin)]
struct Qux<T, U> {
#[pin]
future: T,
field: U,
}
}
// conflicting implementations
impl<T, U> Unpin for Qux<T, U> {} // Non-conditional Unpin impl
pin_project! { //~ ERROR E0119
#[project(!Unpin)]
struct Fred<T, U> {
#[pin]
future: T,
field: U,
}
}
// conflicting implementations
impl<T: Unpin, U: Unpin> Unpin for Fred<T, U> {} // Conditional Unpin impl
fn main() {}

View File

@@ -0,0 +1,81 @@
error[E0119]: conflicting implementations of trait `Unpin` for type `Foo<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:7:1
|
7 | / pin_project! { //~ ERROR E0119
8 | | struct Foo<T, U> {
9 | | #[pin]
10 | | future: T,
... |
13 | | }
| |_^ conflicting implementation for `Foo<_, _>`
...
16 | impl<T, U> Unpin for Foo<T, U> where T: Unpin {} // Conditional Unpin impl
| --------------------------------------------- first implementation here
|
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0119]: conflicting implementations of trait `Unpin` for type `Bar<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:20:1
|
20 | / pin_project! { //~ ERROR E0119
21 | | struct Bar<T, U> {
22 | | #[pin]
23 | | future: T,
... |
26 | | }
| |_^ conflicting implementation for `Bar<_, _>`
...
29 | impl<T, U> Unpin for Bar<T, U> {} // Non-conditional Unpin impl
| ------------------------------ first implementation here
|
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0119]: conflicting implementations of trait `Unpin` for type `Baz<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:31:1
|
31 | / pin_project! { //~ ERROR E0119
32 | | struct Baz<T, U> {
33 | | #[pin]
34 | | future: T,
... |
37 | | }
| |_^ conflicting implementation for `Baz<_, _>`
...
40 | impl<T: Unpin, U: Unpin> Unpin for Baz<T, U> {} // Conditional Unpin impl
| -------------------------------------------- first implementation here
|
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0119]: conflicting implementations of trait `Unpin` for type `Qux<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:42:1
|
42 | / pin_project! { //~ ERROR E0119
43 | | #[project(!Unpin)]
44 | | struct Qux<T, U> {
45 | | #[pin]
... |
49 | | }
| |_^ conflicting implementation for `Qux<_, _>`
...
52 | impl<T, U> Unpin for Qux<T, U> {} // Non-conditional Unpin impl
| ------------------------------ first implementation here
|
= note: upstream crates may add a new impl of trait `std::marker::Unpin` for type `(std::marker::PhantomData<&()>, std::marker::PhantomPinned)` in future versions
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0119]: conflicting implementations of trait `Unpin` for type `Fred<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:54:1
|
54 | / pin_project! { //~ ERROR E0119
55 | | #[project(!Unpin)]
56 | | struct Fred<T, U> {
57 | | #[pin]
... |
61 | | }
| |_^ conflicting implementation for `Fred<_, _>`
...
64 | impl<T: Unpin, U: Unpin> Unpin for Fred<T, U> {} // Conditional Unpin impl
| --------------------------------------------- first implementation here
|
= note: upstream crates may add a new impl of trait `std::marker::Unpin` for type `(std::marker::PhantomData<&()>, std::marker::PhantomPinned)` in future versions
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,95 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct Generics1<T: 'static : Sized> { //~ ERROR no rules expected the token `:`
field: T,
}
}
pin_project! {
struct Generics2<T: 'static : ?Sized> { //~ ERROR no rules expected the token `:`
field: T,
}
}
pin_project! {
struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
field: T,
}
}
pin_project! {
struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
field: T,
}
}
pin_project! {
struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
field: T,
}
}
pin_project! {
struct Generics6<T: ?Sized : Sized> { //~ ERROR no rules expected the token `Sized`
field: T,
}
}
pin_project! {
struct WhereClause1<T>
where
T: 'static : Sized //~ ERROR no rules expected the token `:`
{
field: T,
}
}
pin_project! {
struct WhereClause2<T>
where
T: 'static : ?Sized //~ ERROR no rules expected the token `:`
{
field: T,
}
}
pin_project! {
struct WhereClause3<T>
where
T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
{
field: T,
}
}
pin_project! {
struct WhereClause4<T>
where
T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
{
field: T,
}
}
pin_project! {
struct WhereClause5<T>
where
T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
{
field: T,
}
}
pin_project! {
struct WhereClause6<T>
where
T: ?Sized : Sized //~ ERROR no rules expected the token `Sized`
{
field: T,
}
}
fn main() {}

View File

@@ -0,0 +1,518 @@
error: no rules expected `:`
--> tests/ui/pin_project/invalid-bounds.rs:6:33
|
6 | struct Generics1<T: 'static : Sized> { //~ ERROR no rules expected the token `:`
| ^ no rules expected this token in macro call
|
note: while trying to match `>`
--> src/lib.rs
|
| >)?
| ^
error: no rules expected `:`
--> tests/ui/pin_project/invalid-bounds.rs:12:33
|
12 | struct Generics2<T: 'static : ?Sized> { //~ ERROR no rules expected the token `:`
| ^ no rules expected this token in macro call
|
note: while trying to match `>`
--> src/lib.rs
|
| >)?
| ^
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
17 | / pin_project! {
18 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
19 | | field: T,
20 | | }
21 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
17 | / pin_project! {
18 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
19 | | field: T,
20 | | }
21 | | }
| | ^
| | |
| |_expected one of `+`, `,`, `=`, or `>`
| unexpected token
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
17 | / pin_project! {
18 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
19 | | field: T,
20 | | }
21 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
17 | / pin_project! {
18 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
19 | | field: T,
20 | | }
21 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
23 | / pin_project! {
24 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
25 | | field: T,
26 | | }
27 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: ?$generics_unsized_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
23 | / pin_project! {
24 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
25 | | field: T,
26 | | }
27 | | }
| | ^
| | |
| |_expected one of `+`, `,`, `=`, or `>`
| unexpected token
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: ?$generics_unsized_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
23 | / pin_project! {
24 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
25 | | field: T,
26 | | }
27 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: ?$generics_unsized_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
23 | / pin_project! {
24 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
25 | | field: T,
26 | | }
27 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: ?$generics_unsized_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
29 | / pin_project! {
30 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
31 | | field: T,
32 | | }
33 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
29 | / pin_project! {
30 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
31 | | field: T,
32 | | }
33 | | }
| | ^
| | |
| |_expected one of `+`, `,`, `=`, or `>`
| unexpected token
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
29 | / pin_project! {
30 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
31 | | field: T,
32 | | }
33 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: expected one of `+`, `,`, `=`, or `>`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
29 | / pin_project! {
30 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
31 | | field: T,
32 | | }
33 | | }
| | ^
| | |
| | expected one of `+`, `,`, `=`, or `>`
| |_unexpected token
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might have meant to end the type parameters here
--> src/lib.rs
|
| $(: $generics_bound>)?
| +
error: no rules expected `Sized`
--> tests/ui/pin_project/invalid-bounds.rs:36:34
|
36 | struct Generics6<T: ?Sized : Sized> { //~ ERROR no rules expected the token `Sized`
| ^^^^^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$generics_lifetime_bound:lifetime`
--> src/lib.rs
|
| $(: $generics_lifetime_bound:lifetime)?
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: no rules expected `:`
--> tests/ui/pin_project/invalid-bounds.rs:44:20
|
44 | T: 'static : Sized //~ ERROR no rules expected the token `:`
| ^ no rules expected this token in macro call
|
note: while trying to match `{`
--> src/lib.rs
|
| {
| ^
error: no rules expected `:`
--> tests/ui/pin_project/invalid-bounds.rs:53:20
|
53 | T: 'static : ?Sized //~ ERROR no rules expected the token `:`
| ^ no rules expected this token in macro call
|
note: while trying to match `{`
--> src/lib.rs
|
| {
| ^
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
66 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected one of `+`, `,`, or `{`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
66 | | }
| | ^
| | |
| |_expected one of `+`, `,`, or `{`
| unexpected token
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
66 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
66 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
75 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected one of `+`, `,`, or `{`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
75 | | }
| | ^
| | |
| |_expected one of `+`, `,`, or `{`
| unexpected token
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
75 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
75 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
84 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected one of `+`, `,`, or `{`, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
84 | | }
| | ^
| | |
| |_expected one of `+`, `,`, or `{`
| unexpected token
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
84 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: expected `{` after struct name, found `:`
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
84 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: no rules expected `Sized`
--> tests/ui/pin_project/invalid-bounds.rs:89:21
|
89 | T: ?Sized : Sized //~ ERROR no rules expected the token `Sized`
| ^^^^^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$where_clause_lifetime_bound:lifetime`
--> src/lib.rs
|
| $(: $where_clause_lifetime_bound:lifetime)?
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -0,0 +1,27 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct A<T> {
#[pin()] //~ ERROR no rules expected the token `(`
pinned: T,
}
}
pin_project! {
#[pin] //~ ERROR cannot find attribute `pin` in this scope
struct B<T> {
pinned: T,
}
}
pin_project! {
struct C<T> {
#[pin]
#[pin] //~ ERROR no rules expected the token `#`
pinned: T,
}
}
fn main() {}

View File

@@ -0,0 +1,53 @@
error: no rules expected `(`
--> tests/ui/pin_project/invalid.rs:7:14
|
7 | #[pin()] //~ ERROR no rules expected the token `(`
| ^ no rules expected this token in macro call
|
note: while trying to match `]`
--> src/lib.rs
|
| $(#[$pin:ident])?
| ^
error: no rules expected `(`
--> tests/ui/pin_project/invalid.rs:7:14
|
7 | #[pin()] //~ ERROR no rules expected the token `(`
| ^ no rules expected this token in macro call
|
note: while trying to match `]`
--> src/lib.rs
|
| $(#[$pin:ident])?
| ^
error: no rules expected `#`
--> tests/ui/pin_project/invalid.rs:22:9
|
22 | #[pin] //~ ERROR no rules expected the token `#`
| ^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$field_vis:vis`
--> src/lib.rs
|
| $field_vis:vis $field:ident: $field_ty:ty
| ^^^^^^^^^^^^^^
error: no rules expected `#`
--> tests/ui/pin_project/invalid.rs:22:9
|
22 | #[pin] //~ ERROR no rules expected the token `#`
| ^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$field_vis:vis`
--> src/lib.rs
|
| $field_vis:vis $field:ident: $field_ty:ty
| ^^^^^^^^^^^^^^
error: cannot find attribute `pin` in this scope
--> tests/ui/pin_project/invalid.rs:13:7
|
13 | #[pin] //~ ERROR cannot find attribute `pin` in this scope
| ^^^

View File

@@ -0,0 +1,21 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
// https://github.com/taiki-e/pin-project/issues/340#issuecomment-2428002670
pin_project_lite::pin_project! {
struct Foo<Pinned, Unpinned> {
#[pin]
pinned: Pinned,
unpinned: Unpinned,
}
}
struct MyPhantomPinned(::core::marker::PhantomPinned);
impl Unpin for MyPhantomPinned where for<'cursed> str: Sized {}
impl Unpin for Foo<MyPhantomPinned, ()> {}
fn is_unpin<T: Unpin>() {}
fn main() {
is_unpin::<Foo<MyPhantomPinned, ()>>()
}

View File

@@ -0,0 +1,15 @@
error[E0119]: conflicting implementations of trait `Unpin` for type `Foo<MyPhantomPinned, ()>`
--> tests/ui/pin_project/negative_impls_stable.rs:5:1
|
5 | / pin_project_lite::pin_project! {
6 | | struct Foo<Pinned, Unpinned> {
7 | | #[pin]
8 | | pinned: Pinned,
... |
11 | | }
| |_^ conflicting implementation for `Foo<MyPhantomPinned, ()>`
...
15 | impl Unpin for Foo<MyPhantomPinned, ()> {}
| --------------------------------------- first implementation here
|
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project_lite::pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,12 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! { //~ ERROR E0263,E0496
pub struct Foo<'__pin, T> {
#[pin]
field: &'__pin mut T,
}
}
fn main() {}

View File

@@ -0,0 +1,75 @@
error[E0403]: the name `'__pin` is already used for a generic parameter in this item's generic parameters
--> tests/ui/pin_project/overlapping_lifetime_names.rs:6:20
|
5 | / pin_project! { //~ ERROR E0263,E0496
6 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ already used
7 | | #[pin]
8 | | field: &'__pin mut T,
9 | | }
10 | | }
| |_- first use of `'__pin`
error[E0403]: the name `'__pin` is already used for a generic parameter in this item's generic parameters
--> tests/ui/pin_project/overlapping_lifetime_names.rs:6:20
|
5 | / pin_project! { //~ ERROR E0263,E0496
6 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ already used
7 | | #[pin]
8 | | field: &'__pin mut T,
9 | | }
10 | | }
| |_- first use of `'__pin`
error[E0496]: lifetime name `'__pin` shadows a lifetime name that is already in scope
--> tests/ui/pin_project/overlapping_lifetime_names.rs:5:1
|
5 | / pin_project! { //~ ERROR E0263,E0496
6 | | pub struct Foo<'__pin, T> {
| | ------ first declared here
7 | | #[pin]
8 | | field: &'__pin mut T,
9 | | }
10 | | }
| |_^ lifetime `'__pin` already in scope
|
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0496]: lifetime name `'__pin` shadows a lifetime name that is already in scope
--> tests/ui/pin_project/overlapping_lifetime_names.rs:5:1
|
5 | / pin_project! { //~ ERROR E0263,E0496
6 | | pub struct Foo<'__pin, T> {
| | ------ first declared here
7 | | #[pin]
8 | | field: &'__pin mut T,
9 | | }
10 | | }
| |_^ lifetime `'__pin` already in scope
|
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0403]: the name `'__pin` is already used for a generic parameter in this item's generic parameters
--> tests/ui/pin_project/overlapping_lifetime_names.rs:6:20
|
5 | / pin_project! { //~ ERROR E0263,E0496
6 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ already used
7 | | #[pin]
8 | | field: &'__pin mut T,
9 | | }
10 | | }
| |_- first use of `'__pin`
error[E0403]: the name `'__pin` is already used for a generic parameter in this item's generic parameters
--> tests/ui/pin_project/overlapping_lifetime_names.rs:6:20
|
5 | / pin_project! { //~ ERROR E0263,E0496
6 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ already used
7 | | #[pin]
8 | | field: &'__pin mut T,
9 | | }
10 | | }
| |_- first use of `'__pin`

View File

@@ -0,0 +1,22 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use std::marker::PhantomPinned;
use pin_project_lite::pin_project;
pin_project! {
struct Foo<T> {
#[pin]
inner: T,
}
}
struct __Origin {}
impl Unpin for __Origin {}
fn is_unpin<T: Unpin>() {}
fn main() {
is_unpin::<Foo<PhantomPinned>>(); //~ ERROR E0277
}

View File

@@ -0,0 +1,34 @@
error[E0277]: `PhantomPinned` cannot be unpinned
--> tests/ui/pin_project/overlapping_unpin_struct.rs:21:16
|
21 | is_unpin::<Foo<PhantomPinned>>(); //~ ERROR E0277
| ^^^^^^^^^^^^^^^^^^ within `_::__Origin<'_, PhantomPinned>`, the trait `Unpin` is not implemented for `PhantomPinned`
|
= note: consider using the `pin!` macro
consider using `Box::pin` if you need to access the pinned value outside of the current scope
note: required because it appears within the type `_::__Origin<'_, PhantomPinned>`
--> tests/ui/pin_project/overlapping_unpin_struct.rs:7:1
|
7 | / pin_project! {
8 | | struct Foo<T> {
9 | | #[pin]
10 | | inner: T,
11 | | }
12 | | }
| |_^
note: required for `Foo<PhantomPinned>` to implement `Unpin`
--> tests/ui/pin_project/overlapping_unpin_struct.rs:7:1
|
7 | / pin_project! {
8 | | struct Foo<T> {
9 | | #[pin]
10 | | inner: T,
11 | | }
12 | | }
| |_^ unsatisfied trait bound introduced here
note: required by a bound in `is_unpin`
--> tests/ui/pin_project/overlapping_unpin_struct.rs:18:16
|
18 | fn is_unpin<T: Unpin>() {}
| ^^^^^ required by this bound in `is_unpin`
= note: this error originates in the macro `$crate::__pin_project_make_unpin_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,21 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! { //~ ERROR reference to packed field is unaligned
#[repr(packed, C)]
struct Packed {
#[pin]
field: u16,
}
}
pin_project! { //~ ERROR reference to packed field is unaligned
#[repr(packed(2))]
struct PackedN {
#[pin]
field: u32,
}
}
fn main() {}

View File

@@ -0,0 +1,95 @@
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:5:1
|
5 | / pin_project! { //~ ERROR reference to packed field is unaligned
6 | | #[repr(packed, C)]
7 | | struct Packed {
8 | | #[pin]
... |
11 | | }
| |_^
|
= note: packed structs are only aligned by one byte, and many modern architectures penalize unaligned field accesses
= note: creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers)
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:5:1
|
5 | / pin_project! { //~ ERROR reference to packed field is unaligned
6 | | #[repr(packed, C)]
7 | | struct Packed {
8 | | #[pin]
... |
11 | | }
| |_^
|
= note: packed structs are only aligned by one byte, and many modern architectures penalize unaligned field accesses
= note: creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers)
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:5:1
|
5 | / pin_project! { //~ ERROR reference to packed field is unaligned
6 | | #[repr(packed, C)]
7 | | struct Packed {
8 | | #[pin]
... |
11 | | }
| |_^
|
= note: packed structs are only aligned by one byte, and many modern architectures penalize unaligned field accesses
= note: creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers)
= note: this error originates in the macro `$crate::__pin_project_constant` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:13:1
|
13 | / pin_project! { //~ ERROR reference to packed field is unaligned
14 | | #[repr(packed(2))]
15 | | struct PackedN {
16 | | #[pin]
... |
19 | | }
| |_^
|
= note: packed structs are only aligned by one byte, and many modern architectures penalize unaligned field accesses
= note: creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers)
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:13:1
|
13 | / pin_project! { //~ ERROR reference to packed field is unaligned
14 | | #[repr(packed(2))]
15 | | struct PackedN {
16 | | #[pin]
... |
19 | | }
| |_^
|
= note: packed structs are only aligned by one byte, and many modern architectures penalize unaligned field accesses
= note: creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers)
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:13:1
|
13 | / pin_project! { //~ ERROR reference to packed field is unaligned
14 | | #[repr(packed(2))]
15 | | struct PackedN {
16 | | #[pin]
... |
19 | | }
| |_^
|
= note: packed structs are only aligned by one byte, and many modern architectures penalize unaligned field accesses
= note: creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= help: copy the field contents to a local variable, or replace the reference with a raw pointer and use `read_unaligned`/`write_unaligned` (loads and stores via `*p` must be properly aligned even when using raw pointers)
= note: this error originates in the macro `$crate::__pin_project_constant` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct Foo {
#[pin]
inner: u8,
}
}
impl Unpin for __Origin {} //~ ERROR E0412,E0321
fn main() {}

View File

@@ -0,0 +1,5 @@
error[E0412]: cannot find type `__Origin` in this scope
--> tests/ui/pin_project/unpin_sneaky.rs:12:16
|
12 | impl Unpin for __Origin {} //~ ERROR E0412,E0321
| ^^^^^^^^ not found in this scope

View File

@@ -0,0 +1,29 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
struct Struct1 {} //~ ERROR no rules expected the token `}`
}
pin_project! {
struct Struct2(); //~ ERROR no rules expected the token `(`
}
pin_project! {
struct Struct3; //~ ERROR no rules expected the token `;`
}
pin_project! {
enum Enum { //~ ERROR no rules expected the token `enum`
A(u8)
}
}
pin_project! {
union Union { //~ ERROR no rules expected the token `union`
x: u8,
}
}
fn main() {}

View File

@@ -0,0 +1,111 @@
error: no rules expected `}`
--> tests/ui/pin_project/unsupported.rs:5:1
|
5 | / pin_project! {
6 | | struct Struct1 {} //~ ERROR no rules expected the token `}`
7 | | }
| |_^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$field_vis:vis`
--> src/lib.rs
|
| $field_vis:vis $field:ident: $field_ty:ty
| ^^^^^^^^^^^^^^
= note: this error originates in the macro `$crate::__pin_project_expand` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: no rules expected `}`
--> tests/ui/pin_project/unsupported.rs:5:1
|
5 | / pin_project! {
6 | | struct Struct1 {} //~ ERROR no rules expected the token `}`
7 | | }
| |_^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$field_vis:vis`
--> src/lib.rs
|
| $field_vis:vis $field:ident: $field_ty:ty
| ^^^^^^^^^^^^^^
= note: this error originates in the macro `$crate::__pin_project_expand` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: no rules expected `(`
--> tests/ui/pin_project/unsupported.rs:10:19
|
10 | struct Struct2(); //~ ERROR no rules expected the token `(`
| ^ no rules expected this token in macro call
|
note: while trying to match `{`
--> src/lib.rs
|
| {
| ^
error: no rules expected `;`
--> tests/ui/pin_project/unsupported.rs:14:19
|
14 | struct Struct3; //~ ERROR no rules expected the token `;`
| ^ no rules expected this token in macro call
|
note: while trying to match `{`
--> src/lib.rs
|
| {
| ^
error: no rules expected `(`
--> tests/ui/pin_project/unsupported.rs:19:10
|
19 | A(u8)
| ^ no rules expected this token in macro call
|
note: while trying to match `}`
--> src/lib.rs
|
| }
| ^
error: no rules expected `(`
--> tests/ui/pin_project/unsupported.rs:19:10
|
19 | A(u8)
| ^ no rules expected this token in macro call
|
note: while trying to match `}`
--> src/lib.rs
|
| }
| ^
error: no rules expected identifier `union`
--> tests/ui/pin_project/unsupported.rs:23:1
|
23 | / pin_project! {
24 | | union Union { //~ ERROR no rules expected the token `union`
25 | | x: u8,
26 | | }
27 | | }
| |_^ no rules expected this token in macro call
|
note: while trying to match keyword `struct`
--> src/lib.rs
|
| [$(#[$attrs:meta])* $vis:vis struct $ident:ident]
| ^^^^^^
= note: this error originates in the macro `$crate::__pin_project_expand` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
error: no rules expected identifier `union`
--> tests/ui/pin_project/unsupported.rs:23:1
|
23 | / pin_project! {
24 | | union Union { //~ ERROR no rules expected the token `union`
25 | | x: u8,
26 | | }
27 | | }
| |_^ no rules expected this token in macro call
|
note: while trying to match keyword `struct`
--> src/lib.rs
|
| [$(#[$attrs:meta])* $vis:vis struct $ident:ident]
| ^^^^^^
= note: this error originates in the macro `$crate::__pin_project_expand` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,19 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {
pub struct S {
#[pin]
field: u8,
}
impl PinnedDrop for S {
fn drop(this: Pin<&mut Self>) {
__drop_inner(this);
}
}
}
fn main() {
let _x = S { field: 0 };
}

View File

@@ -0,0 +1,22 @@
error[E0061]: this function takes 0 arguments but 1 argument was supplied
--> tests/ui/pinned_drop/call-drop-inner.rs:12:13
|
12 | __drop_inner(this);
| ^^^^^^^^^^^^ ---- unexpected argument of type `Pin<&mut S>`
|
note: function defined here
--> tests/ui/pinned_drop/call-drop-inner.rs:5:1
|
5 | / pin_project! {
6 | | pub struct S {
7 | | #[pin]
8 | | field: u8,
... |
15 | | }
| |_^
= note: this error originates in the macro `$crate::__pin_project_make_drop_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)
help: remove the extra argument
|
12 - __drop_inner(this);
12 + __drop_inner();
|

View File

@@ -0,0 +1,28 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
// In `Drop` impl, the implementor must specify the same requirement as type definition.
struct DropImpl<T> {
f: T,
}
impl<T: Unpin> Drop for DropImpl<T> {
//~^ ERROR E0367
fn drop(&mut self) {}
}
pin_project! {
//~^ ERROR E0367
struct PinnedDropImpl<T> {
#[pin]
f: T,
}
impl<T: Unpin> PinnedDrop for PinnedDropImpl<T> {
fn drop(_this: Pin<&mut Self>) {}
}
}
fn main() {}

View File

@@ -0,0 +1,34 @@
error[E0367]: `Drop` impl requires `T: Unpin` but the struct it is implemented for does not
--> tests/ui/pinned_drop/conditional-drop-impl.rs:11:9
|
11 | impl<T: Unpin> Drop for DropImpl<T> {
| ^^^^^
|
note: the implementor must specify the same requirement
--> tests/ui/pinned_drop/conditional-drop-impl.rs:7:1
|
7 | struct DropImpl<T> {
| ^^^^^^^^^^^^^^^^^^
error[E0367]: `Drop` impl requires `T: Unpin` but the struct it is implemented for does not
--> tests/ui/pinned_drop/conditional-drop-impl.rs:16:1
|
16 | / pin_project! {
17 | | //~^ ERROR E0367
18 | | struct PinnedDropImpl<T> {
19 | | #[pin]
... |
26 | | }
| |_^
|
note: the implementor must specify the same requirement
--> tests/ui/pinned_drop/conditional-drop-impl.rs:16:1
|
16 | / pin_project! {
17 | | //~^ ERROR E0367
18 | | struct PinnedDropImpl<T> {
19 | | #[pin]
... |
26 | | }
| |_^
= note: this error originates in the macro `$crate::__pin_project_make_drop_impl` which comes from the expansion of the macro `pin_project` (in Nightly builds, run with -Z macro-backtrace for more info)