Bug 1910513 - Update pin-project-lite to 0.2.14 r=supply-chain-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D218156
This commit is contained in:
Mike Hommey
2024-07-31 02:53:18 +00:00
parent a7436b0001
commit 2afb060e80
75 changed files with 1805 additions and 1165 deletions

4
Cargo.lock generated
View File

@@ -4572,9 +4572,9 @@ dependencies = [
[[package]]
name = "pin-project-lite"
version = "0.2.9"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]]
name = "pin-utils"

View File

@@ -3422,6 +3422,11 @@ who = "Mike Hommey <mh+mozilla@glandium.org>"
criteria = "safe-to-run"
delta = "1.0.12 -> 1.1.0"
[[audits.pin-project-lite]]
who = "Mike Hommey <mh+mozilla@glandium.org>"
criteria = "safe-to-deploy"
delta = "0.2.13 -> 0.2.14"
[[audits.pkcs11-bindings]]
who = "Dana Keeler <dkeeler@mozilla.com>"
criteria = "safe-to-deploy"

View File

@@ -1312,6 +1312,13 @@ version = "0.2.9"
notes = "Reviewed on https://fxrev.dev/824504"
aggregated-from = "https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/third_party/rust_crates/supply-chain/audits.toml?format=TEXT"
[[audits.google.audits.pin-project-lite]]
who = "David Koloski <dkoloski@google.com>"
criteria = "safe-to-deploy"
delta = "0.2.9 -> 0.2.13"
notes = "Audited at https://fxrev.dev/946396"
aggregated-from = "https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/third_party/rust_crates/supply-chain/audits.toml?format=TEXT"
[[audits.google.audits.proc-macro2]]
who = "danakj@chromium.org"
criteria = "safe-to-deploy"

File diff suppressed because one or more lines are too long

View File

@@ -10,9 +10,29 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
## [Unreleased]
## [0.2.14] - 2024-03-29
- Document `PinnedDrop`. ([#83](https://github.com/taiki-e/pin-project-lite/pull/83), thanks @jbr)
## [0.2.13] - 2023-08-25
- Allow attributes in impl and method of `PinnedDrop` implementation.
## [0.2.12] - 2023-08-09
- Work around an issue where the projected types/methods appear in the documentation as if they were part of the public API if the visibility is not correctly parsed due to the rustc bug. See [#77](https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180) for details.
## [0.2.11] - 2023-08-06
- Add support for `#[project(!Unpin)]`. This is equivalent to pin-project's [!Unpin](https://docs.rs/pin-project/latest/pin_project/attr.pin_project.html#unpin) option. ([#76](https://github.com/taiki-e/pin-project-lite/pull/76), thanks @matheus-consoli)
## [0.2.10] - 2023-07-02
- Inline project methods. ([#74](https://github.com/taiki-e/pin-project-lite/pull/74), thanks @EFanZh)
## [0.2.9] - 2022-04-26
- Improve compile time of `pin_project!` calls. (#71, thanks @nnethercote)
- Improve compile time of `pin_project!` calls. ([#71](https://github.com/taiki-e/pin-project-lite/pull/71), thanks @nnethercote)
## [0.2.8] - 2021-12-31
@@ -196,7 +216,12 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
Initial release
[Unreleased]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.9...HEAD
[Unreleased]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.14...HEAD
[0.2.14]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.13...v0.2.14
[0.2.13]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.12...v0.2.13
[0.2.12]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.11...v0.2.12
[0.2.11]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.10...v0.2.11
[0.2.10]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.9...v0.2.10
[0.2.9]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.8...v0.2.9
[0.2.8]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.7...v0.2.8
[0.2.7]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.6...v0.2.7

View File

@@ -13,33 +13,125 @@
edition = "2018"
rust-version = "1.37"
name = "pin-project-lite"
version = "0.2.9"
version = "0.2.14"
exclude = [
"/.*",
"/tools",
"/DEVELOPMENT.md",
]
description = """
A lightweight version of pin-project written with declarative macros.
"""
readme = "README.md"
keywords = [
"pin",
"macros",
]
categories = [
"no-std",
"no-std::no-alloc",
"rust-patterns",
]
license = "Apache-2.0 OR MIT"
repository = "https://github.com/taiki-e/pin-project-lite"
[package.metadata.cargo_check_external_types]
allowed_external_types = []
[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
[lib]
doc-scrape-examples = false
[dev-dependencies.rustversion]
version = "1"
[dev-dependencies.static_assertions]
version = "1"
[dev-dependencies.trybuild]
version = "1.0.49"
[lints.clippy]
all = "warn"
as_ptr_cast_mut = "warn"
default_union_representation = "warn"
inline_asm_x86_att_syntax = "warn"
pedantic = "warn"
trailing_empty_array = "warn"
transmute_undefined_repr = "warn"
undocumented_unsafe_blocks = "warn"
[lints.clippy.bool_assert_comparison]
level = "allow"
priority = 1
[lints.clippy.borrow_as_ptr]
level = "allow"
priority = 1
[lints.clippy.declare_interior_mutable_const]
level = "allow"
priority = 1
[lints.clippy.doc_markdown]
level = "allow"
priority = 1
[lints.clippy.float_cmp]
level = "allow"
priority = 1
[lints.clippy.manual_assert]
level = "allow"
priority = 1
[lints.clippy.manual_range_contains]
level = "allow"
priority = 1
[lints.clippy.missing_errors_doc]
level = "allow"
priority = 1
[lints.clippy.module_name_repetitions]
level = "allow"
priority = 1
[lints.clippy.similar_names]
level = "allow"
priority = 1
[lints.clippy.single_match]
level = "allow"
priority = 1
[lints.clippy.single_match_else]
level = "allow"
priority = 1
[lints.clippy.struct_excessive_bools]
level = "allow"
priority = 1
[lints.clippy.struct_field_names]
level = "allow"
priority = 1
[lints.clippy.too_many_arguments]
level = "allow"
priority = 1
[lints.clippy.too_many_lines]
level = "allow"
priority = 1
[lints.clippy.type_complexity]
level = "allow"
priority = 1
[lints.rust]
improper_ctypes = "warn"
improper_ctypes_definitions = "warn"
non_ascii_idents = "warn"
rust_2018_idioms = "warn"
single_use_lifetimes = "warn"
unreachable_pub = "warn"

View File

@@ -1,11 +1,12 @@
# pin-project-lite
[![crates.io](https://img.shields.io/crates/v/pin-project-lite?style=flat-square&logo=rust)](https://crates.io/crates/pin-project-lite)
[![docs.rs](https://img.shields.io/badge/docs.rs-pin--project--lite-blue?style=flat-square)](https://docs.rs/pin-project-lite)
[![docs.rs](https://img.shields.io/badge/docs.rs-pin--project--lite-blue?style=flat-square&logo=docs.rs)](https://docs.rs/pin-project-lite)
[![license](https://img.shields.io/badge/license-Apache--2.0_OR_MIT-blue?style=flat-square)](#license)
[![rustc](https://img.shields.io/badge/rustc-1.37+-blue?style=flat-square&logo=rust)](https://www.rust-lang.org)
[![build status](https://img.shields.io/github/workflow/status/taiki-e/pin-project-lite/CI/main?style=flat-square&logo=github)](https://github.com/taiki-e/pin-project-lite/actions)
[![rust version](https://img.shields.io/badge/rustc-1.37+-blue?style=flat-square&logo=rust)](https://www.rust-lang.org)
[![github actions](https://img.shields.io/github/actions/workflow/status/taiki-e/pin-project-lite/ci.yml?branch=main&style=flat-square&logo=github)](https://github.com/taiki-e/pin-project-lite/actions)
<!-- tidy:crate-doc:start -->
A lightweight version of [pin-project] written with declarative macros.
## Usage
@@ -104,17 +105,21 @@ description of the compile error.
### Different: No support for custom Unpin implementation
pin-project supports this by [`UnsafeUnpin`][unsafe-unpin] and [`!Unpin`][not-unpin].
pin-project supports this by [`UnsafeUnpin`][unsafe-unpin]. (`!Unpin` is supported by both [pin-project][not-unpin] and [pin-project-lite][not-unpin-lite].)
### Different: No support for tuple structs and tuple variants
pin-project supports this.
[`pin_project!`]: https://docs.rs/pin-project-lite/0.2/pin_project_lite/macro.pin_project.html
[not-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unpin
[not-unpin-lite]: https://docs.rs/pin-project-lite/0.2/pin_project_lite/macro.pin_project.html#unpin
[pin-project]: https://github.com/taiki-e/pin-project
[unsafe-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unsafeunpin
<!-- tidy:crate-doc:end -->
[`pin_project!`]: https://docs.rs/pin-project-lite/0.2/pin_project_lite/macro.pin_project.html
## License
Licensed under either of [Apache License, Version 2.0](LICENSE-APACHE) or

View File

@@ -1,98 +1,118 @@
//! A lightweight version of [pin-project] written with declarative macros.
//!
//! # Examples
//!
//! [`pin_project!`] macro creates a projection type covering all the fields of struct.
//!
//! ```rust
//! use std::pin::Pin;
//!
//! use pin_project_lite::pin_project;
//!
//! pin_project! {
//! struct Struct<T, U> {
//! #[pin]
//! pinned: T,
//! unpinned: U,
//! }
//! }
//!
//! impl<T, U> Struct<T, U> {
//! fn method(self: Pin<&mut Self>) {
//! let this = self.project();
//! let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
//! let _: &mut U = this.unpinned; // Normal reference to the field
//! }
//! }
//! ```
//!
//! To use [`pin_project!`] on enums, you need to name the projection type
//! returned from the method.
//!
//! ```rust
//! use std::pin::Pin;
//!
//! use pin_project_lite::pin_project;
//!
//! pin_project! {
//! #[project = EnumProj]
//! enum Enum<T, U> {
//! Variant { #[pin] pinned: T, unpinned: U },
//! }
//! }
//!
//! impl<T, U> Enum<T, U> {
//! fn method(self: Pin<&mut Self>) {
//! match self.project() {
//! EnumProj::Variant { pinned, unpinned } => {
//! let _: Pin<&mut T> = pinned;
//! let _: &mut U = unpinned;
//! }
//! }
//! }
//! }
//! ```
//!
//! # [pin-project] vs pin-project-lite
//!
//! Here are some similarities and differences compared to [pin-project].
//!
//! ## Similar: Safety
//!
//! pin-project-lite guarantees safety in much the same way as [pin-project].
//! Both are completely safe unless you write other unsafe code.
//!
//! ## Different: Minimal design
//!
//! This library does not tackle as expansive of a range of use cases as
//! [pin-project] does. If your use case is not already covered, please use
//! [pin-project].
//!
//! ## Different: No proc-macro related dependencies
//!
//! This is the **only** reason to use this crate. However, **if you already
//! have proc-macro related dependencies in your crate's dependency graph, there
//! is no benefit from using this crate.** (Note: There is almost no difference
//! in the amount of code generated between [pin-project] and pin-project-lite.)
//!
//! ## Different: No useful error messages
//!
//! This macro does not handle any invalid input. So error messages are not to
//! be useful in most cases. If you do need useful error messages, then upon
//! error you can pass the same input to [pin-project] to receive a helpful
//! description of the compile error.
//!
//! ## Different: No support for custom Unpin implementation
//!
//! pin-project supports this by [`UnsafeUnpin`][unsafe-unpin] and [`!Unpin`][not-unpin].
//!
//! ## Different: No support for tuple structs and tuple variants
//!
//! pin-project supports this.
//!
//! [not-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unpin
//! [pin-project]: https://github.com/taiki-e/pin-project
//! [unsafe-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unsafeunpin
// SPDX-License-Identifier: Apache-2.0 OR MIT
/*!
<!-- tidy:crate-doc:start -->
A lightweight version of [pin-project] written with declarative macros.
## Usage
Add this to your `Cargo.toml`:
```toml
[dependencies]
pin-project-lite = "0.2"
```
*Compiler support: requires rustc 1.37+*
## Examples
[`pin_project!`] macro creates a projection type covering all the fields of
struct.
```rust
use std::pin::Pin;
use pin_project_lite::pin_project;
pin_project! {
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
}
impl<T, U> Struct<T, U> {
fn method(self: Pin<&mut Self>) {
let this = self.project();
let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
let _: &mut U = this.unpinned; // Normal reference to the field
}
}
```
To use [`pin_project!`] on enums, you need to name the projection type
returned from the method.
```rust
use std::pin::Pin;
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
enum Enum<T, U> {
Variant { #[pin] pinned: T, unpinned: U },
}
}
impl<T, U> Enum<T, U> {
fn method(self: Pin<&mut Self>) {
match self.project() {
EnumProj::Variant { pinned, unpinned } => {
let _: Pin<&mut T> = pinned;
let _: &mut U = unpinned;
}
}
}
}
```
## [pin-project] vs pin-project-lite
Here are some similarities and differences compared to [pin-project].
### Similar: Safety
pin-project-lite guarantees safety in much the same way as [pin-project].
Both are completely safe unless you write other unsafe code.
### Different: Minimal design
This library does not tackle as expansive of a range of use cases as
[pin-project] does. If your use case is not already covered, please use
[pin-project].
### Different: No proc-macro related dependencies
This is the **only** reason to use this crate. However, **if you already
have proc-macro related dependencies in your crate's dependency graph, there
is no benefit from using this crate.** (Note: There is almost no difference
in the amount of code generated between [pin-project] and pin-project-lite.)
### Different: No useful error messages
This macro does not handle any invalid input. So error messages are not to
be useful in most cases. If you do need useful error messages, then upon
error you can pass the same input to [pin-project] to receive a helpful
description of the compile error.
### Different: No support for custom Unpin implementation
pin-project supports this by [`UnsafeUnpin`][unsafe-unpin]. (`!Unpin` is supported by both [pin-project][not-unpin] and [pin-project-lite][not-unpin-lite].)
### Different: No support for tuple structs and tuple variants
pin-project supports this.
[not-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unpin
[not-unpin-lite]: https://docs.rs/pin-project-lite/0.2/pin_project_lite/macro.pin_project.html#unpin
[pin-project]: https://github.com/taiki-e/pin-project
[unsafe-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unsafeunpin
<!-- tidy:crate-doc:end -->
*/
#![no_std]
#![doc(test(
@@ -102,8 +122,19 @@
allow(dead_code, unused_variables)
)
))]
#![warn(rust_2018_idioms, single_use_lifetimes, unreachable_pub)]
#![warn(clippy::default_trait_access, clippy::wildcard_imports)]
// #![warn(unsafe_op_in_unsafe_fn)] // requires Rust 1.52
#![warn(
// Lints that may help when writing public library.
missing_debug_implementations,
missing_docs,
clippy::alloc_instead_of_core,
clippy::exhaustive_enums,
clippy::exhaustive_structs,
clippy::impl_trait_in_params,
// clippy::missing_inline_in_public_items,
clippy::std_instead_of_alloc,
clippy::std_instead_of_core,
)]
/// A macro that creates a projection type covering all the fields of struct.
///
@@ -114,7 +145,7 @@
///
/// And the following methods are implemented on the original type:
///
/// ```rust
/// ```
/// # use std::pin::Pin;
/// # type Projection<'a> = &'a ();
/// # type ProjectionRef<'a> = &'a ();
@@ -128,7 +159,7 @@
/// you can name the projection type returned from the method. This allows you
/// to use pattern matching on the projected types.
///
/// ```rust
/// ```
/// # use pin_project_lite::pin_project;
/// # use std::pin::Pin;
/// pin_project! {
@@ -154,7 +185,7 @@
/// method which allows the contents of `Pin<&mut Self>` to be replaced while simultaneously moving
/// out all unpinned fields in `Self`.
///
/// ```rust
/// ```
/// # use std::pin::Pin;
/// # type MyProjReplace = ();
/// # trait Dox {
@@ -184,7 +215,7 @@
///
/// # Examples
///
/// ```rust
/// ```
/// use std::pin::Pin;
///
/// use pin_project_lite::pin_project;
@@ -209,7 +240,7 @@
/// To use `pin_project!` on enums, you need to name the projection type
/// returned from the method.
///
/// ```rust
/// ```
/// use std::pin::Pin;
///
/// use pin_project_lite::pin_project;
@@ -241,7 +272,7 @@
/// original [`Pin`] type, it needs to use [`.as_mut()`][`Pin::as_mut`] to avoid
/// consuming the [`Pin`].
///
/// ```rust
/// ```
/// use std::pin::Pin;
///
/// use pin_project_lite::pin_project;
@@ -264,10 +295,24 @@
///
/// # `!Unpin`
///
/// If you want to ensure that [`Unpin`] is not implemented, use `#[pin]`
/// attribute for a [`PhantomPinned`] field.
/// If you want to make sure `Unpin` is not implemented, use the `#[project(!Unpin)]`
/// attribute.
///
/// ```rust
/// ```
/// use pin_project_lite::pin_project;
///
/// pin_project! {
/// #[project(!Unpin)]
/// struct Struct<T> {
/// #[pin]
/// field: T,
/// }
/// }
/// ```
///
/// This is equivalent to using `#[pin]` attribute for a [`PhantomPinned`] field.
///
/// ```
/// use std::marker::PhantomPinned;
///
/// use pin_project_lite::pin_project;
@@ -275,13 +320,60 @@
/// pin_project! {
/// struct Struct<T> {
/// field: T,
/// #[pin] // <------ This `#[pin]` is required to make `Struct` to `!Unpin`.
/// #[pin]
/// _pin: PhantomPinned,
/// }
/// }
/// ```
///
/// Note that using [`PhantomPinned`] without `#[pin]` attribute has no effect.
/// Note that using [`PhantomPinned`] without `#[pin]` or `#[project(!Unpin)]`
/// attribute has no effect.
///
/// # Pinned Drop
///
/// In order to correctly implement pin projections, a types [`Drop`] impl must not move out of any
/// structurally pinned fields. Unfortunately, [`Drop::drop`] takes `&mut Self`, not `Pin<&mut
/// Self>`.
///
/// To implement [`Drop`] for type that has pin, add an `impl PinnedDrop` block at the end of the
/// [`pin_project`] macro block. PinnedDrop has the following interface:
///
/// ```rust
/// # use std::pin::Pin;
/// trait PinnedDrop {
/// fn drop(this: Pin<&mut Self>);
/// }
/// ```
///
/// Note that the argument to `PinnedDrop::drop` cannot be named `self`.
///
/// `pin_project!` implements the actual [`Drop`] trait via PinnedDrop you implemented. To
/// explicitly drop a type that implements PinnedDrop, use the [drop] function just like dropping a
/// type that directly implements [`Drop`].
///
/// `PinnedDrop::drop` will never be called more than once, just like [`Drop::drop`].
///
/// ```rust
/// use pin_project_lite::pin_project;
///
/// pin_project! {
/// pub struct Struct<'a> {
/// was_dropped: &'a mut bool,
/// #[pin]
/// field: u8,
/// }
///
/// impl PinnedDrop for Struct<'_> {
/// fn drop(this: Pin<&mut Self>) { // <----- NOTE: this is not `self`
/// **this.project().was_dropped = true;
/// }
/// }
/// }
///
/// let mut was_dropped = false;
/// drop(Struct { was_dropped: &mut was_dropped, field: 42 });
/// assert!(was_dropped);
/// ```
///
/// [`PhantomPinned`]: core::marker::PhantomPinned
/// [`Pin::as_mut`]: core::pin::Pin::as_mut
@@ -291,7 +383,7 @@
macro_rules! pin_project {
($($tt:tt)*) => {
$crate::__pin_project_internal! {
[][][][]
[][][][][]
$($tt)*
}
};
@@ -313,6 +405,7 @@ macro_rules! __pin_project_expand {
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[$($proj_not_unpin_mark:ident)?]
[$proj_vis:vis]
[$(#[$attrs:meta])* $vis:vis $struct_ty_ident:ident $ident:ident]
[$($def_generics:tt)*]
@@ -320,7 +413,7 @@ macro_rules! __pin_project_expand {
{
$($body_data:tt)*
}
$(impl $($pinned_drop:tt)*)?
$($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)?
) => {
$crate::__pin_project_reconstruct! {
[$(#[$attrs])* $vis $struct_ty_ident $ident]
@@ -362,13 +455,14 @@ macro_rules! __pin_project_expand {
$crate::__pin_project_constant! {
[$(#[$attrs])* $vis $struct_ty_ident $ident]
[$($proj_mut_ident)?] [$($proj_ref_ident)?] [$($proj_replace_ident)?]
[$($proj_not_unpin_mark)?]
[$proj_vis]
[$($def_generics)*] [$($impl_generics)*]
[$($ty_generics)*] [$(where $($where_clause)*)?]
{
$($body_data)*
}
$(impl $($pinned_drop)*)?
$($(#[$drop_impl_attrs])* impl $($pinned_drop)*)?
}
};
}
@@ -379,6 +473,7 @@ macro_rules! __pin_project_constant {
(
[$(#[$attrs:meta])* $vis:vis struct $ident:ident]
[$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?]
[$($proj_not_unpin_mark:ident)?]
[$proj_vis:vis]
[$($def_generics:tt)*]
[$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
@@ -388,7 +483,7 @@ macro_rules! __pin_project_constant {
$field_vis:vis $field:ident: $field_ty:ty
),+ $(,)?
}
$(impl $($pinned_drop:tt)*)?
$($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)?
) => {
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
@@ -466,6 +561,7 @@ macro_rules! __pin_project_constant {
}
$crate::__pin_project_make_unpin_impl! {
[$($proj_not_unpin_mark)?]
[$vis $ident]
[$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
$(
@@ -478,7 +574,7 @@ macro_rules! __pin_project_constant {
$crate::__pin_project_make_drop_impl! {
[$ident]
[$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
$(impl $($pinned_drop)*)?
$($(#[$drop_impl_attrs])* impl $($pinned_drop)*)?
}
// Ensure that it's impossible to use pin projections on a #[repr(packed)] struct.
@@ -515,6 +611,7 @@ macro_rules! __pin_project_constant {
(
[$(#[$attrs:meta])* $vis:vis enum $ident:ident]
[$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?]
[$($proj_not_unpin_mark:ident)?]
[$proj_vis:vis]
[$($def_generics:tt)*]
[$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
@@ -529,7 +626,7 @@ macro_rules! __pin_project_constant {
})?
),+ $(,)?
}
$(impl $($pinned_drop:tt)*)?
$($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)?
) => {
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
// This lint warns of `clippy::*` generated by external macros.
@@ -591,6 +688,7 @@ macro_rules! __pin_project_constant {
}
$crate::__pin_project_make_unpin_impl! {
[$($proj_not_unpin_mark)?]
[$vis $ident]
[$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
$(
@@ -607,7 +705,7 @@ macro_rules! __pin_project_constant {
$crate::__pin_project_make_drop_impl! {
[$ident]
[$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
$(impl $($pinned_drop)*)?
$($(#[$drop_impl_attrs])* impl $($pinned_drop)*)?
}
// We don't need to check for '#[repr(packed)]',
@@ -752,6 +850,7 @@ macro_rules! __pin_project_make_proj_ty_body {
[$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
[$($body_data:tt)+]
) => {
#[doc(hidden)] // Workaround for rustc bug: see https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180 for more.
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
// This lint warns of `clippy::*` generated by external macros.
@@ -845,6 +944,7 @@ macro_rules! __pin_project_make_proj_replace_ty_body {
[$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
[$($body_data:tt)+]
) => {
#[doc(hidden)] // Workaround for rustc bug: see https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180 for more.
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(clippy::mut_mut)] // This lint warns `&mut &mut <ty>`. (only needed for project)
@@ -923,6 +1023,8 @@ macro_rules! __pin_project_struct_make_proj_method {
),+
}
) => {
#[doc(hidden)] // Workaround for rustc bug: see https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180 for more.
#[inline]
$proj_vis fn $method_ident<'__pin>(
self: $crate::__private::Pin<&'__pin $($mut)? Self>,
) -> $proj_ty_ident <'__pin, $($ty_generics)*> {
@@ -956,6 +1058,8 @@ macro_rules! __pin_project_struct_make_proj_replace_method {
),+
}
) => {
#[doc(hidden)] // Workaround for rustc bug: see https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180 for more.
#[inline]
$proj_vis fn project_replace(
self: $crate::__private::Pin<&mut Self>,
replacement: Self,
@@ -1003,6 +1107,8 @@ macro_rules! __pin_project_enum_make_proj_method {
),+
}
) => {
#[doc(hidden)] // Workaround for rustc bug: see https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180 for more.
#[inline]
$proj_vis fn $method_ident<'__pin>(
self: $crate::__private::Pin<&'__pin $($mut)? Self>,
) -> $proj_ty_ident <'__pin, $($ty_generics)*> {
@@ -1046,6 +1152,8 @@ macro_rules! __pin_project_enum_make_proj_replace_method {
),+
}
) => {
#[doc(hidden)] // Workaround for rustc bug: see https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180 for more.
#[inline]
$proj_vis fn project_replace(
self: $crate::__private::Pin<&mut Self>,
replacement: Self,
@@ -1083,6 +1191,7 @@ macro_rules! __pin_project_enum_make_proj_replace_method {
#[macro_export]
macro_rules! __pin_project_make_unpin_impl {
(
[]
[$vis:vis $ident:ident]
[$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
$($field:tt)*
@@ -1090,7 +1199,7 @@ macro_rules! __pin_project_make_unpin_impl {
// Automatically create the appropriate conditional `Unpin` implementation.
//
// Basically this is equivalent to the following code:
// ```rust
// ```
// impl<T, U> Unpin for Struct<T, U> where T: Unpin {}
// ```
//
@@ -1127,6 +1236,23 @@ macro_rules! __pin_project_make_unpin_impl {
{
}
};
(
[$proj_not_unpin_mark:ident]
[$vis:vis $ident:ident]
[$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
$($field:tt)*
) => {
#[doc(hidden)]
impl <'__pin, $($impl_generics)*> $crate::__private::Unpin for $ident <$($ty_generics)*>
where
(
::core::marker::PhantomData<&'__pin ()>,
::core::marker::PhantomPinned,
): $crate::__private::Unpin
$(, $($where_clause)*)?
{
}
}
}
#[doc(hidden)]
@@ -1135,6 +1261,7 @@ macro_rules! __pin_project_make_drop_impl {
(
[$_ident:ident]
[$($_impl_generics:tt)*] [$($_ty_generics:tt)*] [$(where $($_where_clause:tt)*)?]
$(#[$drop_impl_attrs:meta])*
impl $(<
$( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)?
$( $generics:ident
@@ -1151,11 +1278,13 @@ macro_rules! __pin_project_make_drop_impl {
),* $(,)?
)?
{
$(#[$drop_fn_attrs:meta])*
fn drop($($arg:ident)+: Pin<&mut Self>) {
$($tt:tt)*
}
}
) => {
$(#[$drop_impl_attrs])*
impl $(<
$( $lifetime $(: $lifetime_bound)? ,)*
$( $generics
@@ -1172,6 +1301,7 @@ macro_rules! __pin_project_make_drop_impl {
),*
)?
{
$(#[$drop_fn_attrs])*
fn drop(&mut self) {
// Implementing `__DropInner::__drop_inner` is safe, but calling it is not safe.
// This is because destructors can be called multiple times in safe code and
@@ -1325,6 +1455,7 @@ macro_rules! __pin_project_internal {
[]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[$( ! $proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
#[project = $proj_mut_ident:ident]
@@ -1334,6 +1465,7 @@ macro_rules! __pin_project_internal {
[$proj_mut_ident]
[$($proj_ref_ident)?]
[$($proj_replace_ident)?]
[$( ! $proj_not_unpin_mark)?]
[$($attrs)*]
$($tt)*
}
@@ -1343,6 +1475,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident:ident)?]
[]
[$($proj_replace_ident:ident)?]
[$( ! $proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
#[project_ref = $proj_ref_ident:ident]
@@ -1352,6 +1485,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident)?]
[$proj_ref_ident]
[$($proj_replace_ident)?]
[$( ! $proj_not_unpin_mark)?]
[$($attrs)*]
$($tt)*
}
@@ -1361,6 +1495,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[]
[$( ! $proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
#[project_replace = $proj_replace_ident:ident]
@@ -1370,6 +1505,27 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident)?]
[$($proj_ref_ident)?]
[$proj_replace_ident]
[$( ! $proj_not_unpin_mark)?]
[$($attrs)*]
$($tt)*
}
};
// parsing !Unpin
(
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[]
[$($attrs:tt)*]
#[project( ! $proj_not_unpin_mark:ident)]
$($tt:tt)*
) => {
$crate::__pin_project_internal! {
[$($proj_mut_ident)?]
[$($proj_ref_ident)?]
[$($proj_replace_ident)?]
[ ! $proj_not_unpin_mark]
[$($attrs)*]
$($tt)*
}
@@ -1380,6 +1536,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[$( ! $proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
#[$($attr:tt)*]
@@ -1389,6 +1546,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident)?]
[$($proj_ref_ident)?]
[$($proj_replace_ident)?]
[$( ! $proj_not_unpin_mark)?]
[$($attrs)* #[$($attr)*]]
$($tt)*
}
@@ -1399,6 +1557,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[$( ! $proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
pub $struct_ty_ident:ident $ident:ident
$($tt:tt)*
@@ -1407,6 +1566,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident)?]
[$($proj_ref_ident)?]
[$($proj_replace_ident)?]
[$($proj_not_unpin_mark)?]
[$($attrs)*]
[pub $struct_ty_ident $ident pub(crate)]
$($tt)*
@@ -1416,6 +1576,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[$( ! $proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
$vis:vis $struct_ty_ident:ident $ident:ident
$($tt:tt)*
@@ -1424,6 +1585,7 @@ macro_rules! __pin_project_internal {
[$($proj_mut_ident)?]
[$($proj_ref_ident)?]
[$($proj_replace_ident)?]
[$($proj_not_unpin_mark)?]
[$($attrs)*]
[$vis $struct_ty_ident $ident $vis]
$($tt)*
@@ -1438,8 +1600,9 @@ macro_rules! __pin_project_parse_generics {
[$($proj_mut_ident:ident)?]
[$($proj_ref_ident:ident)?]
[$($proj_replace_ident:ident)?]
[$($proj_not_unpin_mark:ident)?]
[$($attrs:tt)*]
[$vis:vis $struct_ty_ident:ident $ident:ident $proj_ty_vis:vis]
[$vis:vis $struct_ty_ident:ident $ident:ident $proj_vis:vis]
$(<
$( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)?
$( $generics:ident
@@ -1459,13 +1622,14 @@ macro_rules! __pin_project_parse_generics {
{
$($body_data:tt)*
}
$(impl $($pinned_drop:tt)*)?
$($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)?
) => {
$crate::__pin_project_expand! {
[$($proj_mut_ident)?]
[$($proj_ref_ident)?]
[$($proj_replace_ident)?]
[$proj_ty_vis]
[$($proj_not_unpin_mark)?]
[$proj_vis]
[$($attrs)* $vis $struct_ty_ident $ident]
[$(<
$( $lifetime $(: $lifetime_bound)? ,)*
@@ -1493,12 +1657,14 @@ macro_rules! __pin_project_parse_generics {
{
$($body_data)*
}
$(impl $($pinned_drop)*)?
$($(#[$drop_impl_attrs])* impl $($pinned_drop)*)?
}
};
}
// Not public API.
#[doc(hidden)]
#[allow(missing_debug_implementations)]
pub mod __private {
use core::mem::ManuallyDrop;
#[doc(hidden)]
@@ -1528,6 +1694,8 @@ pub mod __private {
impl<T: ?Sized> Drop for UnsafeDropInPlaceGuard<T> {
fn drop(&mut self) {
// SAFETY: the caller of `UnsafeDropInPlaceGuard::new` must guarantee
// that `ptr` is valid for drop when this guard is destructed.
unsafe {
ptr::drop_in_place(self.0);
}
@@ -1551,6 +1719,8 @@ pub mod __private {
impl<T> Drop for UnsafeOverwriteGuard<T> {
fn drop(&mut self) {
// SAFETY: the caller of `UnsafeOverwriteGuard::new` must guarantee
// that `target` is valid for writes when this guard is destructed.
unsafe {
ptr::write(self.target, ptr::read(&*self.value));
}

View File

@@ -1,46 +0,0 @@
# Tests
Many of the tests in this repository are based on [pin-project's tests](https://github.com/taiki-e/pin-project/tree/HEAD/tests).
To run all tests, run the following command:
```sh
cargo +nightly test --all
```
## UI tests (`ui`, `compiletest.rs`)
This checks errors detected by the macro or the Rust compiler in the resulting
expanded code.
To run this test, run the following command:
```sh
cargo +nightly test --test compiletest
```
Locally, this test updates the files in the `ui` directory if there are
changes to the generated code. If there are any changes to the files in the
`ui` directory after running the test, please commit them.
See also [`trybuild` documentation](https://docs.rs/trybuild).
## Expansion tests (`expand`, `expandtest.rs`)
Similar to ui tests, but instead of checking the compiler output, this checks
the code generated by macros.
See pin-project's [examples](https://github.com/taiki-e/pin-project/tree/HEAD/examples)
for descriptions of what the generated code does, and why it needs to be generated.
To run this test, run the following command:
```sh
cargo +nightly test --test expandtest
```
Locally, this test updates the files in the `expand` directory if there are
changes to the generated code. If there are any changes to the files in the
`expand` directory after running the test, please commit them.
See also [`macrotest` documentation](https://docs.rs/macrotest).

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![allow(dead_code, unused_macros)]
macro_rules! assert_unpin {

View File

@@ -1,15 +1,12 @@
#![cfg(not(miri))]
#![warn(rust_2018_idioms, single_use_lifetimes)]
// SPDX-License-Identifier: Apache-2.0 OR MIT
use std::env;
#![cfg(not(miri))]
#![cfg(not(careful))]
#[rustversion::attr(not(nightly), ignore)]
#[test]
fn ui() {
if env::var_os("CI").is_none() {
env::set_var("TRYBUILD", "overwrite");
}
let t = trybuild::TestCases::new();
t.compile_fail("tests/ui/**/*.rs");
t.pass("tests/run-pass/**/*.rs");
}

View File

@@ -1,4 +1,4 @@
#![warn(rust_2018_idioms, single_use_lifetimes)]
// SPDX-License-Identifier: Apache-2.0 OR MIT
// Refs: https://doc.rust-lang.org/reference/destructors.html

View File

@@ -3,6 +3,7 @@ enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -20,6 +21,7 @@ where
},
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -37,16 +39,14 @@ where
},
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::type_repetition_in_bounds)]
enum EnumProjReplace<T, U> {
Struct {
pinned: ::pin_project_lite::__private::PhantomData<T>,
unpinned: U,
},
Struct { pinned: ::pin_project_lite::__private::PhantomData<T>, unpinned: U },
Unit,
}
#[allow(single_use_lifetimes)]
@@ -54,32 +54,46 @@ enum EnumProjReplace<T, U> {
#[allow(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::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::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,
@@ -98,7 +112,9 @@ const _: () = {
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(pinned),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned,
),
(),
);
}
@@ -115,10 +131,10 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -9,6 +9,7 @@ struct Struct<T, U> {
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -23,6 +24,7 @@ const _: () = {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -38,6 +40,8 @@ const _: () = {
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> {
@@ -49,6 +53,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
@@ -67,10 +73,10 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -1,13 +1,9 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct {
pinned1: T,
pinned2: T,
unpinned1: U,
unpinned2: U,
},
Struct { pinned1: T, pinned2: T, unpinned1: U, unpinned2: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
@@ -27,6 +23,8 @@ enum EnumProjReplace<T, U> {
#[allow(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,
@@ -38,22 +36,25 @@ const _: () = {
replacement,
);
match &mut *__self_ptr {
Self::Struct {
pinned1,
pinned2,
unpinned1,
unpinned2,
} => {
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),
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),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned1,
),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned2,
),
(),
(),
);
@@ -76,10 +77,10 @@ const _: () = {
),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -5,6 +5,7 @@ struct Struct<T, U> {
unpinned1: U,
unpinned2: U,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
@@ -22,6 +23,7 @@ struct StructProjReplace<T, U> {
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -38,6 +40,7 @@ const _: () = {
unpinned1: &'__pin mut (U),
unpinned2: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -55,16 +58,14 @@ const _: () = {
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();
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),
@@ -73,16 +74,13 @@ const _: () = {
}
}
}
#[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();
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),
@@ -91,6 +89,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
@@ -101,12 +101,7 @@ const _: () = {
__self_ptr,
replacement,
);
let Self {
pinned1,
pinned2,
unpinned1,
unpinned2,
} = &mut *__self_ptr;
let Self { pinned1, pinned2, unpinned1, unpinned2 } = &mut *__self_ptr;
let result = StructProjReplace {
pinned1: ::pin_project_lite::__private::PhantomData,
pinned2: ::pin_project_lite::__private::PhantomData,
@@ -115,8 +110,12 @@ const _: () = {
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(pinned1),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(pinned2),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned1,
),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned2,
),
(),
(),
);
@@ -133,10 +132,10 @@ const _: () = {
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
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -3,6 +3,7 @@ enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -20,6 +21,7 @@ where
},
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -37,16 +39,14 @@ where
},
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::type_repetition_in_bounds)]
enum EnumProjReplace<T, U> {
Struct {
pinned: ::pin_project_lite::__private::PhantomData<T>,
unpinned: U,
},
Struct { pinned: ::pin_project_lite::__private::PhantomData<T>, unpinned: U },
Unit,
}
#[allow(single_use_lifetimes)]
@@ -54,32 +54,46 @@ enum EnumProjReplace<T, U> {
#[allow(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::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::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,
@@ -98,7 +112,9 @@ const _: () = {
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(pinned),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned,
),
(),
);
}
@@ -115,10 +131,10 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -3,6 +3,7 @@ enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -25,15 +26,21 @@ where
#[allow(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::Struct { pinned, unpinned } => {
EnumProj::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProj::Unit,
}
}
@@ -45,10 +52,10 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -14,10 +14,10 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -3,6 +3,7 @@ enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -25,15 +26,21 @@ where
#[allow(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::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
@@ -45,10 +52,10 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -3,6 +3,7 @@ struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -17,6 +18,7 @@ where
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -31,6 +33,7 @@ where
pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>,
unpinned: &'__pin (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
@@ -47,6 +50,8 @@ struct StructProjReplace<T, U> {
#[allow(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> {
@@ -58,6 +63,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> StructProjRef<'__pin, T, U> {
@@ -69,6 +76,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_replace(
self: ::pin_project_lite::__private::Pin<&mut Self>,
replacement: Self,
@@ -86,7 +95,9 @@ const _: () = {
};
{
(
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(pinned),
::pin_project_lite::__private::UnsafeDropInPlaceGuard::new(
pinned,
),
(),
);
}
@@ -100,10 +111,10 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -3,6 +3,7 @@ struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -23,6 +24,7 @@ where
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -38,6 +40,8 @@ const _: () = {
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> {
@@ -49,6 +53,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
@@ -67,10 +73,10 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -9,6 +9,7 @@ struct Struct<T, U> {
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -23,6 +24,7 @@ const _: () = {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -38,6 +40,8 @@ const _: () = {
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> {
@@ -49,6 +53,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
@@ -67,10 +73,10 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -3,6 +3,7 @@ struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -23,6 +24,7 @@ where
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -38,6 +40,8 @@ const _: () = {
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> {
@@ -49,6 +53,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> StructProjRef<'__pin, T, U> {
@@ -67,10 +73,10 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -0,0 +1,99 @@
use pin_project_lite::pin_project;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
#[allow(clippy::mut_mut)]
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::ref_option_ref)]
#[allow(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)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
#[allow(clippy::mut_mut)]
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::ref_option_ref)]
#[allow(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)]
#[allow(clippy::unknown_clippy_lints)]
#[allow(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
(
::core::marker::PhantomData<&'__pin ()>,
::core::marker::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,88 @@
use pin_project_lite::pin_project;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
#[allow(clippy::mut_mut)]
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::ref_option_ref)]
#[allow(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)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
#[allow(clippy::mut_mut)]
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::ref_option_ref)]
#[allow(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)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
#[allow(clippy::redundant_pub_crate)]
#[allow(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
(
::core::marker::PhantomData<&'__pin ()>,
::core::marker::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

@@ -1,9 +1,9 @@
use pin_project_lite::pin_project;
use std::pin::Pin;
enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -21,6 +21,7 @@ where
},
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -43,28 +44,40 @@ where
#[allow(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::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::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
@@ -76,18 +89,21 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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<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) };
let pinned_self: ::pin_project_lite::__private::Pin<&mut Self> = unsafe {
::pin_project_lite::__private::Pin::new_unchecked(self)
};
__drop_inner(pinned_self);
}
}

View File

@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
use std::pin::Pin;
pin_project! {
#[project = EnumProj]

View File

@@ -1,5 +1,4 @@
use pin_project_lite::pin_project;
use std::pin::Pin;
struct Struct<T, U> {
pinned: T,
unpinned: U,
@@ -10,6 +9,7 @@ struct Struct<T, U> {
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -24,6 +24,7 @@ const _: () = {
pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -39,6 +40,8 @@ const _: () = {
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> {
@@ -50,6 +53,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
@@ -68,18 +73,21 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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<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) };
let pinned_self: ::pin_project_lite::__private::Pin<&mut Self> = unsafe {
::pin_project_lite::__private::Pin::new_unchecked(self)
};
__drop_inner(pinned_self);
}
}

View File

@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
use std::pin::Pin;
pin_project! {
struct Struct<T, U> {

View File

@@ -3,6 +3,7 @@ pub enum Enum<T, U> {
Struct { pinned: T, unpinned: U },
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -20,6 +21,7 @@ where
},
Unit,
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -42,28 +44,40 @@ where
#[allow(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::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::Struct { pinned, unpinned } => {
EnumProjRef::Struct {
pinned: ::pin_project_lite::__private::Pin::new_unchecked(
pinned,
),
unpinned: unpinned,
}
}
Self::Unit => EnumProjRef::Unit,
}
}
@@ -75,10 +89,10 @@ const _: () = {
Struct: (T, ::pin_project_lite::__private::AlwaysUnpin<U>),
Unit: (),
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -9,6 +9,7 @@ pub struct Struct<T, U> {
#[allow(clippy::redundant_pub_crate)]
#[allow(clippy::used_underscore_binding)]
const _: () = {
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -23,6 +24,7 @@ const _: () = {
pub pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>,
pub unpinned: &'__pin mut (U),
}
#[doc(hidden)]
#[allow(dead_code)]
#[allow(single_use_lifetimes)]
#[allow(clippy::unknown_clippy_lints)]
@@ -38,6 +40,8 @@ const _: () = {
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> {
@@ -49,6 +53,8 @@ const _: () = {
}
}
}
#[doc(hidden)]
#[inline]
pub(crate) fn project_ref<'__pin>(
self: ::pin_project_lite::__private::Pin<&'__pin Self>,
) -> ProjectionRef<'__pin, T, U> {
@@ -67,10 +73,10 @@ const _: () = {
pinned: T,
unpinned: ::pin_project_lite::__private::AlwaysUnpin<U>,
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U> where
__Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin
{
}
impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct<T, U>
where
__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 {}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -1,43 +1,11 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![cfg(not(miri))]
#![warn(rust_2018_idioms, single_use_lifetimes)]
use std::{
env,
process::{Command, ExitStatus, Stdio},
};
const PATH: &str = "tests/expand/**/*.rs";
#![cfg(not(careful))]
#[rustversion::attr(not(nightly), ignore)]
#[test]
fn expandtest() {
let is_ci = env::var_os("CI").is_some();
let cargo = &*env::var("CARGO").unwrap_or_else(|_| "cargo".into());
if !has_command(&[cargo, "expand"]) || !has_command(&[cargo, "fmt"]) {
if is_ci {
panic!("expandtest requires rustfmt and cargo-expand");
}
return;
}
let args = &["--all-features"];
if is_ci {
macrotest::expand_without_refresh_args(PATH, args);
} else {
env::set_var("MACROTEST", "overwrite");
macrotest::expand_args(PATH, args);
}
}
fn has_command(command: &[&str]) -> bool {
Command::new(command[0])
.args(&command[1..])
.arg("--version")
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.status()
.as_ref()
.map(ExitStatus::success)
.unwrap_or(false)
macrotest::expand_args("tests/expand/**/*.rs", args);
}

View File

@@ -1,6 +1,9 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
// default pin_project! is completely safe.
::pin_project_lite::pin_project! {
/// Testing default struct.
#[derive(Debug)]
pub struct DefaultStruct<T, U> {
#[pin]
@@ -10,6 +13,7 @@
}
::pin_project_lite::pin_project! {
/// Testing named struct.
#[project = DefaultStructProj]
#[project_ref = DefaultStructProjRef]
#[derive(Debug)]
@@ -21,15 +25,18 @@
}
::pin_project_lite::pin_project! {
/// Testing enum.
#[project = DefaultEnumProj]
#[project_ref = DefaultEnumProjRef]
#[derive(Debug)]
pub enum DefaultEnum<T, U> {
/// Struct variant.
Struct {
#[pin]
pinned: T,
unpinned: U,
},
/// Unit variant.
Unit,
}
}

View File

@@ -1,263 +0,0 @@
// Check interoperability with rustc and clippy lints.
#![forbid(unsafe_code)]
// for old compilers
#![allow(unknown_lints)]
#![warn(nonstandard_style, rust_2018_idioms, unused)]
// Note: This does not guarantee compatibility with forbidding these lints in the future.
// If rustc adds a new lint, we may not be able to keep this.
#![forbid(future_incompatible, rust_2018_compatibility, rust_2021_compatibility)]
// lints forbidden as a part of future_incompatible, rust_2018_compatibility, and rust_2021_compatibility are not included in the list below.
// elided_lifetimes_in_paths, explicit_outlives_requirements, unused_extern_crates: as a part of rust_2018_idioms
// unsafe_op_in_unsafe_fn: requires Rust 1.52. and, we don't generate unsafe fn.
// non_exhaustive_omitted_patterns: unstable
// unstable_features: no way to generate #![feature(..)] by macros, expect for unstable inner attribute. and this lint is deprecated: https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#unstable-features
// unused_crate_dependencies, must_not_suspend: unrelated
// unsafe_code: checked in forbid_unsafe module
#![warn(
box_pointers,
deprecated_in_future,
fuzzy_provenance_casts,
lossy_provenance_casts,
macro_use_extern_crate,
meta_variable_misuse,
missing_abi,
missing_copy_implementations,
missing_debug_implementations,
missing_docs,
non_ascii_idents,
noop_method_call,
single_use_lifetimes,
trivial_casts,
trivial_numeric_casts,
unreachable_pub,
unused_import_braces,
unused_lifetimes,
unused_qualifications,
unused_results,
variant_size_differences
)]
#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::restriction)]
#![allow(clippy::blanket_clippy_restriction_lints)] // this is a test, so enable all restriction lints intentionally.
#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums, clippy::single_char_lifetime_names)] // TODO
pub mod basic {
include!("include/basic.rs");
}
pub mod box_pointers {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct {
#[pin]
pub p: Box<isize>,
pub u: Box<isize>,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Debug)]
pub enum Enum {
Struct {
#[pin]
p: Box<isize>,
u: Box<isize>,
},
Unit,
}
}
}
pub mod explicit_outlives_requirements {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<'a, T, U>
where
T: ?Sized,
U: ?Sized,
{
#[pin]
pub pinned: &'a mut T,
pub unpinned: &'a mut U,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Debug)]
pub enum Enum<'a, T, U>
where
T: ?Sized,
U: ?Sized,
{
Struct {
#[pin]
pinned: &'a mut T,
unpinned: &'a mut U,
},
Unit,
}
}
}
pub mod variant_size_differences {
use pin_project_lite::pin_project;
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[allow(missing_debug_implementations, missing_copy_implementations)] // https://github.com/rust-lang/rust/pull/74060
#[allow(variant_size_differences)] // for the type itself
#[allow(clippy::large_enum_variant)] // for the type itself
pub enum Enum {
V1 { f: u8 },
V2 { f: [u8; 1024] },
}
}
}
pub mod clippy_mut_mut {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<'a, T, U> {
#[pin]
pub pinned: &'a mut T,
pub unpinned: &'a mut U,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Debug)]
pub enum Enum<'a, T, U> {
Struct {
#[pin]
pinned: &'a mut T,
unpinned: &'a mut U,
},
Unit,
}
}
}
#[allow(unreachable_pub)]
mod clippy_redundant_pub_crate {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<T, U> {
#[pin]
pub pinned: T,
pub unpinned: U,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Debug)]
pub enum Enum<T, U> {
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
}
#[allow(clippy::use_self)]
pub mod clippy_type_repetition_in_bounds {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<T, U>
where
Struct<T, U>: Sized,
{
#[pin]
pub pinned: T,
pub unpinned: U,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Debug)]
pub enum Enum<T, U>
where
Enum<T, U>: Sized,
{
Struct {
#[pin]
pinned: T,
unpinned: U,
},
Unit,
}
}
}
pub mod clippy_used_underscore_binding {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<T, U> {
#[pin]
pub _pinned: T,
pub _unpinned: U,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
#[derive(Debug)]
pub enum Enum<T, U> {
Struct {
#[pin]
_pinned: T,
_unpinned: U,
},
}
}
}
pub mod clippy_ref_option_ref {
use pin_project_lite::pin_project;
pin_project! {
pub struct Struct<'a> {
#[pin]
pub _pinned: Option<&'a ()>,
pub _unpinned: Option<&'a ()>,
}
}
pin_project! {
#[project = EnumProj]
#[project_ref = EnumProjRef]
pub enum Enum<'a> {
Struct {
#[pin]
_pinned: Option<&'a ()>,
_unpinned: Option<&'a ()>,
},
}
}
}

View File

@@ -1,4 +1,5 @@
#![warn(rust_2018_idioms, single_use_lifetimes)]
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![allow(dead_code)]
#[macro_use]
@@ -46,6 +47,18 @@ pub mod default {
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]
@@ -64,4 +77,25 @@ pub mod default {
}
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<'_, (), ()>);
}

View File

@@ -1,5 +1,6 @@
#![warn(rust_2018_idioms, single_use_lifetimes)]
#![allow(dead_code)]
// SPDX-License-Identifier: Apache-2.0 OR MIT
#![allow(dead_code, unreachable_pub, clippy::no_effect_underscore_binding)]
#[macro_use]
mod auxiliary;
@@ -616,6 +617,7 @@ fn attrs() {
pin_project! {
/// dox1
#[derive(Clone)]
#[project(!Unpin)]
#[project = Enum2Proj]
#[project_ref = Enum2ProjRef]
/// dox2
@@ -682,11 +684,13 @@ fn pinned_drop() {
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

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! { //~ ERROR E0119

View File

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

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
// The same implementation.
@@ -37,4 +39,28 @@ pin_project! { //~ ERROR E0119
// 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

@@ -1,50 +1,84 @@
error[E0119]: conflicting implementations of trait `std::marker::Unpin` for type `Foo<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:5:1
error[E0119]: conflicting implementations of trait `Unpin` for type `Foo<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:7:1
|
5 | / pin_project! { //~ ERROR E0119
6 | | struct Foo<T, U> {
7 | | #[pin]
8 | | future: T,
9 | | field: U,
10 | | }
11 | | }
7 | / pin_project! { //~ ERROR E0119
8 | | struct Foo<T, U> {
9 | | #[pin]
10 | | future: T,
11 | | field: U,
12 | | }
13 | | }
| |_^ conflicting implementation for `Foo<_, _>`
...
14 | impl<T, U> Unpin for Foo<T, U> where T: Unpin {} // Conditional Unpin impl
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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 `std::marker::Unpin` for type `Bar<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:18:1
error[E0119]: conflicting implementations of trait `Unpin` for type `Bar<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:20:1
|
18 | / pin_project! { //~ ERROR E0119
19 | | struct Bar<T, U> {
20 | | #[pin]
21 | | future: T,
22 | | field: U,
23 | | }
24 | | }
20 | / pin_project! { //~ ERROR E0119
21 | | struct Bar<T, U> {
22 | | #[pin]
23 | | future: T,
24 | | field: U,
25 | | }
26 | | }
| |_^ conflicting implementation for `Bar<_, _>`
...
27 | impl<T, U> Unpin for Bar<T, U> {} // Non-conditional Unpin impl
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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 `std::marker::Unpin` for type `Baz<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:29:1
error[E0119]: conflicting implementations of trait `Unpin` for type `Baz<_, _>`
--> tests/ui/pin_project/conflict-unpin.rs:31:1
|
29 | / pin_project! { //~ ERROR E0119
30 | | struct Baz<T, U> {
31 | | #[pin]
32 | | future: T,
33 | | field: U,
34 | | }
35 | | }
31 | / pin_project! { //~ ERROR E0119
32 | | struct Baz<T, U> {
33 | | #[pin]
34 | | future: T,
35 | | field: U,
36 | | }
37 | | }
| |_^ conflicting implementation for `Baz<_, _>`
...
38 | impl<T: Unpin, U: Unpin> Unpin for Baz<T, U> {} // Conditional Unpin impl
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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]
... |
48 | | }
49 | | }
| |_^ conflicting implementation for `Qux<_, _>`
...
52 | impl<T, U> Unpin for Qux<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 `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]
... |
60 | | }
61 | | }
| |_^ conflicting implementation for `Fred<_, _>`
...
64 | impl<T: Unpin, U: Unpin> Unpin for Fred<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)

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -1,428 +1,530 @@
error: no rules expected the token `:`
--> tests/ui/pin_project/invalid-bounds.rs:4:33
--> tests/ui/pin_project/invalid-bounds.rs:6:33
|
4 | struct Generics1<T: 'static : Sized> { //~ ERROR no rules expected the token `:`
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 the token `:`
--> tests/ui/pin_project/invalid-bounds.rs:10:33
--> tests/ui/pin_project/invalid-bounds.rs:12:33
|
10 | struct Generics2<T: 'static : ?Sized> { //~ ERROR no rules expected the token `:`
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:15:1
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
15 | / pin_project! {
16 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
17 | | field: T,
18 | | }
19 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:15:1
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
15 | / pin_project! {
16 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
17 | | field: T,
18 | | }
19 | | }
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: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:15:1
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
15 | / pin_project! {
16 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
17 | | field: T,
18 | | }
19 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:15:1
--> tests/ui/pin_project/invalid-bounds.rs:17:1
|
15 | / pin_project! {
16 | | struct Generics3<T: Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
17 | | field: T,
18 | | }
19 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:21:1
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
21 | / pin_project! {
22 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
23 | | field: T,
24 | | }
25 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:21:1
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
21 | / pin_project! {
22 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
23 | | field: T,
24 | | }
25 | | }
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: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:21:1
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
21 | / pin_project! {
22 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
23 | | field: T,
24 | | }
25 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:21:1
--> tests/ui/pin_project/invalid-bounds.rs:23:1
|
21 | / pin_project! {
22 | | struct Generics4<T: ?Sized : 'static> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
23 | | field: T,
24 | | }
25 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:27:1
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
27 | / pin_project! {
28 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
29 | | field: T,
30 | | }
31 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:27:1
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
27 | / pin_project! {
28 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
29 | | field: T,
30 | | }
31 | | }
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: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:27:1
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
27 | / pin_project! {
28 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
29 | | field: T,
30 | | }
31 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:27:1
--> tests/ui/pin_project/invalid-bounds.rs:29:1
|
27 | / pin_project! {
28 | | struct Generics5<T: Sized : ?Sized> { //~ ERROR expected one of `+`, `,`, `=`, or `>`, found `:`
29 | | field: T,
30 | | }
31 | | }
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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 the token `Sized`
--> tests/ui/pin_project/invalid-bounds.rs:34:34
--> tests/ui/pin_project/invalid-bounds.rs:36:34
|
34 | struct Generics6<T: ?Sized : Sized> { //~ ERROR no rules expected the token `Sized`
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 the token `:`
--> tests/ui/pin_project/invalid-bounds.rs:42:20
--> tests/ui/pin_project/invalid-bounds.rs:44:20
|
42 | T: 'static : Sized //~ ERROR no rules expected the token `:`
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 the token `:`
--> tests/ui/pin_project/invalid-bounds.rs:51:20
--> tests/ui/pin_project/invalid-bounds.rs:53:20
|
51 | T: 'static : ?Sized //~ ERROR no rules expected the token `:`
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:57:1
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
57 | / pin_project! {
58 | | struct WhereClause3<T>
59 | | where
60 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
63 | | }
64 | | }
65 | | }
66 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:57:1
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
57 | / pin_project! {
58 | | struct WhereClause3<T>
59 | | where
60 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
63 | | }
64 | | }
65 | | }
66 | | }
| | ^
| | |
| |_expected one of `+`, `,`, or `{`
| unexpected token
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:57:1
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
57 | / pin_project! {
58 | | struct WhereClause3<T>
59 | | where
60 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
63 | | }
64 | | }
65 | | }
66 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:57:1
--> tests/ui/pin_project/invalid-bounds.rs:59:1
|
57 | / pin_project! {
58 | | struct WhereClause3<T>
59 | | where
60 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
59 | / pin_project! {
60 | | struct WhereClause3<T>
61 | | where
62 | | T: Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
63 | | }
64 | | }
65 | | }
66 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:66:1
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
66 | / pin_project! {
67 | | struct WhereClause4<T>
68 | | where
69 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
72 | | }
73 | | }
74 | | }
75 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:66:1
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
66 | / pin_project! {
67 | | struct WhereClause4<T>
68 | | where
69 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
72 | | }
73 | | }
74 | | }
75 | | }
| | ^
| | |
| |_expected one of `+`, `,`, or `{`
| unexpected token
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:66:1
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
66 | / pin_project! {
67 | | struct WhereClause4<T>
68 | | where
69 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
72 | | }
73 | | }
74 | | }
75 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:66:1
--> tests/ui/pin_project/invalid-bounds.rs:68:1
|
66 | / pin_project! {
67 | | struct WhereClause4<T>
68 | | where
69 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
68 | / pin_project! {
69 | | struct WhereClause4<T>
70 | | where
71 | | T: ?Sized : 'static //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
72 | | }
73 | | }
74 | | }
75 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:75:1
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
75 | / pin_project! {
76 | | struct WhereClause5<T>
77 | | where
78 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
81 | | }
82 | | }
83 | | }
84 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:75:1
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
75 | / pin_project! {
76 | | struct WhereClause5<T>
77 | | where
78 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
81 | | }
82 | | }
83 | | }
84 | | }
| | ^
| | |
| |_expected one of `+`, `,`, or `{`
| unexpected token
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:75:1
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
75 | / pin_project! {
76 | | struct WhereClause5<T>
77 | | where
78 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
81 | | }
82 | | }
83 | | }
84 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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:75:1
--> tests/ui/pin_project/invalid-bounds.rs:77:1
|
75 | / pin_project! {
76 | | struct WhereClause5<T>
77 | | where
78 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
77 | / pin_project! {
78 | | struct WhereClause5<T>
79 | | where
80 | | T: Sized : ?Sized //~ ERROR expected `where`, or `{` after struct name, found `:`
... |
81 | | }
82 | | }
83 | | }
84 | | }
| | ^
| | |
| |_expected `{` after struct name
| in this macro invocation
|
= note: this error originates in the macro `$crate::__pin_project_parse_generics` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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 the token `Sized`
--> tests/ui/pin_project/invalid-bounds.rs:87:21
--> tests/ui/pin_project/invalid-bounds.rs:89:21
|
87 | T: ?Sized : Sized //~ ERROR no rules expected the token `Sized`
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

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -1,59 +1,53 @@
error: no rules expected the token `struct`
--> tests/ui/pin_project/invalid.rs:3:1
error: no rules expected the token `(`
--> tests/ui/pin_project/invalid.rs:7:14
|
3 | / pin_project! {
4 | | struct A<T> {
5 | | #[pin()] //~ ERROR no rules expected the token `(`
6 | | pinned: T,
7 | | }
8 | | }
| |_^ no rules expected this token in macro call
7 | #[pin()] //~ ERROR no rules expected the token `(`
| ^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
note: while trying to match `]`
--> src/lib.rs
|
| $(#[$pin:ident])?
| ^
error: no rules expected the token `struct`
--> tests/ui/pin_project/invalid.rs:3:1
error: no rules expected the token `(`
--> tests/ui/pin_project/invalid.rs:7:14
|
3 | / pin_project! {
4 | | struct A<T> {
5 | | #[pin()] //~ ERROR no rules expected the token `(`
6 | | pinned: T,
7 | | }
8 | | }
| |_^ no rules expected this token in macro call
7 | #[pin()] //~ ERROR no rules expected the token `(`
| ^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
note: while trying to match `]`
--> src/lib.rs
|
| $(#[$pin:ident])?
| ^
error: no rules expected the token `struct`
--> tests/ui/pin_project/invalid.rs:17:1
error: no rules expected the token `#`
--> tests/ui/pin_project/invalid.rs:22:9
|
17 | / pin_project! {
18 | | struct C<T> {
19 | | #[pin]
20 | | #[pin] //~ ERROR no rules expected the token `#`
21 | | pinned: T,
22 | | }
23 | | }
| |_^ no rules expected this token in macro call
22 | #[pin] //~ ERROR no rules expected the token `#`
| ^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
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 the token `struct`
--> tests/ui/pin_project/invalid.rs:17:1
error: no rules expected the token `#`
--> tests/ui/pin_project/invalid.rs:22:9
|
17 | / pin_project! {
18 | | struct C<T> {
19 | | #[pin]
20 | | #[pin] //~ ERROR no rules expected the token `#`
21 | | pinned: T,
22 | | }
23 | | }
| |_^ no rules expected this token in macro call
22 | #[pin] //~ ERROR no rules expected the token `#`
| ^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
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:11:7
--> tests/ui/pin_project/invalid.rs:13:7
|
11 | #[pin] //~ ERROR cannot find attribute `pin` in this scope
13 | #[pin] //~ ERROR cannot find attribute `pin` in this scope
| ^^^

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! { //~ ERROR E0263,E0496

View File

@@ -1,75 +1,75 @@
error[E0263]: lifetime name `'__pin` declared twice in the same scope
--> tests/ui/pin_project/overlapping_lifetime_names.rs:4:20
|
3 | / pin_project! { //~ ERROR E0263,E0496
4 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ declared twice
5 | | #[pin]
6 | | field: &'__pin mut T,
7 | | }
8 | | }
| |_- previous declaration here
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[E0263]: lifetime name `'__pin` declared twice in the same scope
--> tests/ui/pin_project/overlapping_lifetime_names.rs:4:20
|
3 | / pin_project! { //~ ERROR E0263,E0496
4 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ declared twice
5 | | #[pin]
6 | | field: &'__pin mut T,
7 | | }
8 | | }
| |_- previous declaration here
error[E0263]: lifetime name `'__pin` declared twice in the same scope
--> tests/ui/pin_project/overlapping_lifetime_names.rs:4:20
|
3 | / pin_project! { //~ ERROR E0263,E0496
4 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ declared twice
5 | | #[pin]
6 | | field: &'__pin mut T,
7 | | }
8 | | }
| |_- previous declaration here
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:3:1
|
3 | / pin_project! { //~ ERROR E0263,E0496
4 | | pub struct Foo<'__pin, T> {
| | ------ first declared here
5 | | #[pin]
6 | | field: &'__pin mut T,
7 | | }
8 | | }
| |_^ lifetime `'__pin` already in scope
|
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` (in Nightly builds, run with -Z macro-backtrace for more info)
--> 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:3:1
|
3 | / pin_project! { //~ ERROR E0263,E0496
4 | | pub struct Foo<'__pin, T> {
| | ------ first declared here
5 | | #[pin]
6 | | field: &'__pin mut T,
7 | | }
8 | | }
| |_^ lifetime `'__pin` already in scope
|
= note: this error originates in the macro `$crate::__pin_project_struct_make_proj_method` (in Nightly builds, run with -Z macro-backtrace for more info)
--> 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[E0263]: lifetime name `'__pin` declared twice in the same scope
--> tests/ui/pin_project/overlapping_lifetime_names.rs:4:20
|
3 | / pin_project! { //~ ERROR E0263,E0496
4 | | pub struct Foo<'__pin, T> {
| | ^^^^^^ declared twice
5 | | #[pin]
6 | | field: &'__pin mut T,
7 | | }
8 | | }
| |_- previous declaration here
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

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use std::marker::PhantomPinned;
use pin_project_lite::pin_project;

View File

@@ -1,33 +1,34 @@
error[E0277]: `PhantomPinned` cannot be unpinned
--> tests/ui/pin_project/overlapping_unpin_struct.rs:19:5
--> tests/ui/pin_project/overlapping_unpin_struct.rs:21:16
|
19 | is_unpin::<Foo<PhantomPinned>>(); //~ ERROR E0277
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ within `_::__Origin<'_, PhantomPinned>`, the trait `Unpin` is not implemented for `PhantomPinned`
21 | is_unpin::<Foo<PhantomPinned>>(); //~ ERROR E0277
| ^^^^^^^^^^^^^^^^^^ within `_::__Origin<'_, PhantomPinned>`, the trait `Unpin` is not implemented for `PhantomPinned`, which is required by `Foo<PhantomPinned>: Unpin`
|
= note: consider using `Box::pin`
= 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:5:1
--> tests/ui/pin_project/overlapping_unpin_struct.rs:7:1
|
5 | / pin_project! {
6 | | struct Foo<T> {
7 | | #[pin]
8 | | inner: T,
9 | | }
10 | | }
7 | / pin_project! {
8 | | struct Foo<T> {
9 | | #[pin]
10 | | inner: T,
11 | | }
12 | | }
| |_^
note: required because of the requirements on the impl of `Unpin` for `Foo<PhantomPinned>`
--> tests/ui/pin_project/overlapping_unpin_struct.rs:5:1
note: required for `Foo<PhantomPinned>` to implement `Unpin`
--> tests/ui/pin_project/overlapping_unpin_struct.rs:7:1
|
5 | / pin_project! {
6 | | struct Foo<T> {
7 | | #[pin]
8 | | inner: T,
9 | | }
10 | | }
| |_^
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:16:16
--> tests/ui/pin_project/overlapping_unpin_struct.rs:18:16
|
16 | fn is_unpin<T: Unpin>() {}
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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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

@@ -1,4 +1,4 @@
#![allow(unaligned_references)]
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;

View File

@@ -1,4 +1,4 @@
error: reference to packed field is unaligned
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
@@ -10,48 +10,92 @@ error: reference to packed field is unaligned
11 | | }
| |_^
|
note: the lint level is defined here
--> 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]
9 | | field: u16,
10 | | }
11 | | }
| |_^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
= note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= 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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:13:1
error[E0793]: reference to packed field is unaligned
--> tests/ui/pin_project/packed.rs:5:1
|
13 | / pin_project! { //~ ERROR reference to packed field is unaligned
14 | | #[repr(packed(2))]
15 | | struct PackedN {
16 | | #[pin]
17 | | field: u32,
18 | | }
19 | | }
5 | / pin_project! { //~ ERROR reference to packed field is unaligned
6 | | #[repr(packed, C)]
7 | | struct Packed {
8 | | #[pin]
9 | | field: u16,
10 | | }
11 | | }
| |_^
|
note: the lint level is defined here
--> 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]
17 | | field: u32,
18 | | }
19 | | }
| |_^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82523 <https://github.com/rust-lang/rust/issues/82523>
= note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
= 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` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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]
9 | | field: u16,
10 | | }
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]
17 | | field: u32,
18 | | }
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]
17 | | field: u32,
18 | | }
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]
17 | | field: u32,
18 | | }
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

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -1,11 +1,5 @@
error[E0412]: cannot find type `__Origin` in this scope
--> tests/ui/pin_project/unpin_sneaky.rs:10:16
--> tests/ui/pin_project/unpin_sneaky.rs:12:16
|
10 | impl Unpin for __Origin {} //~ ERROR E0412,E0321
12 | impl Unpin for __Origin {} //~ ERROR E0412,E0321
| ^^^^^^^^ not found in this scope
error[E0321]: cross-crate traits with a default impl, like `Unpin`, can only be implemented for a struct/enum type, not `[type error]`
--> tests/ui/pin_project/unpin_sneaky.rs:10:1
|
10 | impl Unpin for __Origin {} //~ ERROR E0412,E0321
| ^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

@@ -1,79 +1,125 @@
error: no rules expected the token `}`
--> tests/ui/pin_project/unsupported.rs:3:1
--> tests/ui/pin_project/unsupported.rs:5:1
|
3 | / pin_project! {
4 | | struct Struct1 {} //~ ERROR no rules expected the token `}`
5 | | }
5 | / pin_project! {
6 | | struct Struct1 {} //~ ERROR no rules expected the token `}`
7 | | }
| |_^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
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 the token `}`
--> tests/ui/pin_project/unsupported.rs:3:1
--> tests/ui/pin_project/unsupported.rs:5:1
|
3 | / pin_project! {
4 | | struct Struct1 {} //~ ERROR no rules expected the token `}`
5 | | }
5 | / pin_project! {
6 | | struct Struct1 {} //~ ERROR no rules expected the token `}`
7 | | }
| |_^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
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 the token `(`
--> tests/ui/pin_project/unsupported.rs:8:19
|
8 | struct Struct2(); //~ ERROR no rules expected the token `(`
| ^ no rules expected this token in macro call
--> 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 the token `;`
--> tests/ui/pin_project/unsupported.rs:12:19
--> tests/ui/pin_project/unsupported.rs:14:19
|
12 | struct Struct3; //~ ERROR no rules expected the token `;`
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 the token `enum`
--> tests/ui/pin_project/unsupported.rs:15:1
error: no rules expected the token `(`
--> tests/ui/pin_project/unsupported.rs:19:10
|
15 | / pin_project! {
16 | | enum Enum { //~ ERROR no rules expected the token `enum`
17 | | A(u8)
18 | | }
19 | | }
| |_^ no rules expected this token in macro call
19 | A(u8)
| ^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
note: while trying to match `}`
--> src/lib.rs
|
| }
| ^
error: no rules expected the token `enum`
--> tests/ui/pin_project/unsupported.rs:15:1
error: no rules expected the token `(`
--> tests/ui/pin_project/unsupported.rs:19:10
|
15 | / pin_project! {
16 | | enum Enum { //~ ERROR no rules expected the token `enum`
17 | | A(u8)
18 | | }
19 | | }
| |_^ no rules expected this token in macro call
19 | A(u8)
| ^ no rules expected this token in macro call
|
= note: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
note: while trying to match `}`
--> src/lib.rs
|
| }
| ^
error: no rules expected the token `union`
--> tests/ui/pin_project/unsupported.rs:21:1
--> tests/ui/pin_project/unsupported.rs:23:1
|
21 | / pin_project! {
22 | | union Union { //~ ERROR no rules expected the token `union`
23 | | x: u8,
24 | | }
25 | | }
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: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
::: src/lib.rs
|
| [$(#[$attrs:meta])* $vis:vis $struct_ty_ident:ident $ident:ident]
| ----------------------
|
note: while trying to match `struct`
--> src/lib.rs
|
| [$(#[$attrs:meta])* $vis:vis struct $ident:ident]
| ^^^^^^
= note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
= note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
= 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 the token `union`
--> tests/ui/pin_project/unsupported.rs:21:1
--> tests/ui/pin_project/unsupported.rs:23:1
|
21 | / pin_project! {
22 | | union Union { //~ ERROR no rules expected the token `union`
23 | | x: u8,
24 | | }
25 | | }
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: this error originates in the macro `$crate::__pin_project_expand` (in Nightly builds, run with -Z macro-backtrace for more info)
::: src/lib.rs
|
| [$(#[$attrs:meta])* $vis:vis $struct_ty_ident:ident $ident:ident]
| ----------------------
|
note: while trying to match `struct`
--> src/lib.rs
|
| [$(#[$attrs:meta])* $vis:vis struct $ident:ident]
| ^^^^^^
= note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
= note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
= 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

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use pin_project_lite::pin_project;
pin_project! {

View File

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

@@ -1,3 +1,5 @@
// 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.

View File

@@ -1,38 +1,36 @@
error[E0367]: `Drop` impl requires `T: Unpin` but the struct it is implemented for does not
--> tests/ui/pinned_drop/conditional-drop-impl.rs:9:9
|
9 | impl<T: Unpin> Drop for DropImpl<T> {
| ^^^^^
|
--> 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:5:1
|
5 | / struct DropImpl<T> {
6 | | f: T,
7 | | }
| |_^
--> 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:14:1
--> tests/ui/pinned_drop/conditional-drop-impl.rs:16:1
|
14 | / pin_project! {
15 | | //~^ ERROR E0367
16 | | struct PinnedDropImpl<T> {
17 | | #[pin]
16 | / pin_project! {
17 | | //~^ ERROR E0367
18 | | struct PinnedDropImpl<T> {
19 | | #[pin]
... |
23 | | }
24 | | }
25 | | }
26 | | }
| |_^
|
note: the implementor must specify the same requirement
--> tests/ui/pinned_drop/conditional-drop-impl.rs:14:1
--> tests/ui/pinned_drop/conditional-drop-impl.rs:16:1
|
14 | / pin_project! {
15 | | //~^ ERROR E0367
16 | | struct PinnedDropImpl<T> {
17 | | #[pin]
16 | / pin_project! {
17 | | //~^ ERROR E0367
18 | | struct PinnedDropImpl<T> {
19 | | #[pin]
... |
23 | | }
24 | | }
25 | | }
26 | | }
| |_^
= note: this error originates in the macro `$crate::__pin_project_make_drop_impl` (in Nightly builds, run with -Z macro-backtrace for more info)
= 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)