diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38a3a8c5..e7f033d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,8 @@ env: CARGO_INCREMENTAL: 0 CARGO_NET_RETRY: 10 CARGO_TERM_COLOR: always - RUST_BACKTRACE: 1 + RUST_BACKTRACE: full + RUSTDOCFLAGS: -D warnings RUSTFLAGS: -D warnings RUSTUP_MAX_RETRIES: 10 @@ -39,13 +40,13 @@ jobs: - nightly runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - uses: taiki-e/github-actions/install-rust@main with: toolchain: ${{ matrix.rust }} - component: rustfmt,rust-src + component: rust-src target: thumbv7m-none-eabi - uses: dtolnay/install@cargo-expand if: startsWith(matrix.rust, 'nightly') @@ -53,33 +54,33 @@ jobs: - run: cargo build --manifest-path tests/no-std/Cargo.toml --target thumbv7m-none-eabi - run: cargo build --manifest-path tests/rust-2015/Cargo.toml --target thumbv7m-none-eabi - build: + msrv: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - - uses: taiki-e/github-actions/install-rust@main - uses: taiki-e/install-action@cargo-hack - run: cargo hack build --workspace --ignore-private --no-dev-deps --version-range .. --version-step 2 miri: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - uses: taiki-e/github-actions/install-rust@main with: component: miri - - run: cargo miri test --workspace + - run: cargo miri test --workspace --all-features env: - MIRIFLAGS: -Zmiri-tag-raw-pointers + MIRIFLAGS: -Zmiri-strict-provenance -Zmiri-symbolic-alignment-check + RUSTFLAGS: ${{ env.RUSTFLAGS }} -Z randomize-layout tidy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - uses: taiki-e/github-actions/install-rust@main @@ -88,7 +89,7 @@ jobs: - uses: taiki-e/install-action@cargo-hack - uses: taiki-e/install-action@cargo-minimal-versions - uses: taiki-e/install-action@shellcheck - - run: cargo fmt --all -- --check + - run: cargo fmt --all --check if: always() - run: cargo clippy --workspace --all-features --all-targets if: always() @@ -100,13 +101,11 @@ jobs: docs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - uses: taiki-e/github-actions/install-rust@main - run: cargo doc --workspace --all-features - env: - RUSTDOCFLAGS: -D warnings # This job doesn't actually test anything, but they're used to tell bors the # build completed, as there is no practical way to detect when a workflow is @@ -119,7 +118,7 @@ jobs: if: github.event_name == 'push' && success() needs: - test - - build + - msrv - miri - tidy - docs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2f159c6a..736d9753 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ env: CARGO_INCREMENTAL: 0 CARGO_NET_RETRY: 10 CARGO_TERM_COLOR: always - RUST_BACKTRACE: 1 + RUST_BACKTRACE: full RUSTFLAGS: -D warnings RUSTUP_MAX_RETRIES: 10 @@ -26,7 +26,7 @@ jobs: if: github.repository_owner == 'taiki-e' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - uses: taiki-e/github-actions/install-rust@main diff --git a/CHANGELOG.md b/CHANGELOG.md index ebac043a..452ec689 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,15 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org). ## [Unreleased] +## [1.0.11] - 2022-07-02 + +- [Suppress `dead_code` lint in generated code.](https://github.com/taiki-e/pin-project/pull/346) + ## [1.0.10] - 2021-12-31 - Revert the increase of the minimal version of `syn` that was done in 1.0.9. @@ -50,13 +54,13 @@ NOTE: In this file, do not use the hard wrap in the middle of a sentence for com ## [1.0.1] - 2020-10-15 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/commit/ddcd88079ba2d82857c365f2a3543ad146ade54c). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/commit/ddcd88079ba2d82857c365f2a3543ad146ade54c). - [Fix warnings when `#[pin_project]` attribute used within `macro_rules!` macros.](https://github.com/taiki-e/pin-project/pull/298) ## [1.0.0] - 2020-10-13 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/commit/ddcd88079ba2d82857c365f2a3543ad146ade54c). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/commit/ddcd88079ba2d82857c365f2a3543ad146ade54c). - [Remove deprecated `#[project]`, `#[project_ref]`, and `#[project_replace]` attributes.](https://github.com/taiki-e/pin-project/pull/265) @@ -128,62 +132,66 @@ Changes since the 1.0.0-alpha.1 release: See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project/issues/264). +## [0.4.30] - 2022-07-02 + +- [Suppress `dead_code` lint in generated code.](https://github.com/taiki-e/pin-project/pull/347) + ## [0.4.29] - 2021-12-26 - [Fix compile error with `syn` 1.0.84 and later.](https://github.com/taiki-e/pin-project/pull/335) ## [0.4.28] - 2021-03-28 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix `unused_must_use` warning on unused borrows, which will be added to rustc in the future.](https://github.com/taiki-e/pin-project/pull/322) See [#322](https://github.com/taiki-e/pin-project/pull/322) for more details. - (NOTE: 1.0 does not have this problem.) + (Note: 1.0 does not have this problem.) ## [0.4.27] - 2020-10-11 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - Update minimal version of `syn` to 1.0.44. ## [0.4.26] - 2020-10-04 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix drop order of pinned fields in `project_replace`.](https://github.com/taiki-e/pin-project/pull/287) ## [0.4.25] - 2020-10-01 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Suppress `drop_bounds` lint, which will be added to rustc in the future.](https://github.com/taiki-e/pin-project/pull/273) See [#272](https://github.com/taiki-e/pin-project/issues/272) for more details. - (NOTE: 1.0.0-alpha.1 already contains this change.) + (Note: 1.0.0-alpha.1 already contains this change.) ## [0.4.24] - 2020-09-26 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix compatibility of generated code with `forbid(future_incompatible)`.](https://github.com/taiki-e/pin-project/pull/282) - NOTE: This does not guarantee compatibility with `forbid(future_incompatible)` in the future. + Note: This does not guarantee compatibility with `forbid(future_incompatible)` in the future. If rustc adds a new lint, we may not be able to keep this. ## [0.4.23] - 2020-07-27 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix compile error with `?Sized` type parameters.](https://github.com/taiki-e/pin-project/pull/263) ## [0.4.22] - 2020-06-14 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - Documentation improvements. ## [0.4.21] - 2020-06-13 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Deprecated `#[project]`, `#[project_ref]`, and `#[project_replace]` attributes due to some unfixable limitations.](https://github.com/taiki-e/pin-project/pull/244) @@ -214,7 +222,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.20] - 2020-06-07 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [You can now use `project_replace` argument without Replace argument.](https://github.com/taiki-e/pin-project/pull/243) This used to require you to specify both. @@ -242,13 +250,13 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.19] - 2020-06-04 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Suppress `unused_results` lint in generated code.](https://github.com/taiki-e/pin-project/pull/239) ## [0.4.18] - 2020-06-04 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Support `Self` in more syntax positions inside `#[pinned_drop]` impl.](https://github.com/taiki-e/pin-project/pull/230) @@ -260,7 +268,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.17] - 2020-05-18 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Support naming the projection types.](https://github.com/taiki-e/pin-project/pull/202) @@ -283,19 +291,19 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.16] - 2020-05-11 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix an issue that users can call internal function generated by `#[pinned_drop]`.](https://github.com/taiki-e/pin-project/pull/223) ## [0.4.15] - 2020-05-10 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [`#[project]` attribute can now handle all `project*` attributes in that scope with one wrapper attribute.](https://github.com/taiki-e/pin-project/pull/220) ## [0.4.14] - 2020-05-09 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Add `!Unpin` option to `#[pin_project]` attribute for guarantee the type is `!Unpin`.](https://github.com/taiki-e/pin-project/pull/219) @@ -317,7 +325,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project } ``` - *[NOTE: This raises the minimum supported Rust version of this crate from Rust 1.33 to Rust 1.34.](https://github.com/taiki-e/pin-project/pull/219#pullrequestreview-408644187)* + *[Note: This raises the minimum supported Rust version of this crate from Rust 1.33 to Rust 1.34.](https://github.com/taiki-e/pin-project/pull/219#pullrequestreview-408644187)* - [Fix an issue where duplicate `#[project]` attributes were ignored.](https://github.com/taiki-e/pin-project/pull/218) @@ -331,7 +339,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.13] - 2020-05-07 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix a regression in 0.4.11.](https://github.com/taiki-e/pin-project/pull/207) @@ -349,13 +357,13 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.12] - 2020-05-07 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - A release to avoid [a regression in 0.4.11](https://github.com/taiki-e/pin-project/issues/206). No code changes from [0.4.10](https://github.com/taiki-e/pin-project/releases/tag/v0.4.10). ## [0.4.11] - 2020-05-07 -**NOTE:** This release has been yanked. See [#206](https://github.com/taiki-e/pin-project/issues/206) for details. +**Note:** This release has been yanked. See [#206](https://github.com/taiki-e/pin-project/issues/206) for details. - [Fix an issue that `#[project]` on non-statement expression does not work without unstable features.](https://github.com/taiki-e/pin-project/pull/197) @@ -369,7 +377,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.10] - 2020-05-04 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Add `project_replace` method and `#[project_replace]` attribute.](https://github.com/taiki-e/pin-project/pull/194) `project_replace` method is optional and can be enabled by passing the `Replace` argument to `#[pin_project]` attribute. @@ -381,7 +389,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.9] - 2020-04-14 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix lifetime inference error when associated types are used in fields.](https://github.com/taiki-e/pin-project/pull/188) @@ -391,7 +399,7 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.8] - 2020-01-27 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Ensure that users cannot implement `PinnedDrop` without proper attribute argument.](https://github.com/taiki-e/pin-project/pull/180) @@ -399,31 +407,31 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.7] - 2020-01-20 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix support for lifetime bounds.](https://github.com/taiki-e/pin-project/pull/176) ## [0.4.6] - 2019-11-20 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix compile error when there is `Self` in the where clause.](https://github.com/taiki-e/pin-project/pull/169) ## [0.4.5] - 2019-10-21 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix compile error with `dyn` types.](https://github.com/taiki-e/pin-project/pull/158) ## [0.4.4] - 2019-10-17 -**NOTE:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). +**Note:** This release has been yanked because it [failed to compile with syn 1.0.84 and later](https://github.com/taiki-e/pin-project/pull/335). - [Fix an issue where `PinnedDrop` implementations can call unsafe code without an unsafe block.](https://github.com/taiki-e/pin-project/pull/149) ## [0.4.3] - 2019-10-15 -**NOTE:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. +**Note:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. - [`#[pin_project]` can now interoperate with `#[cfg_attr()]`.](https://github.com/taiki-e/pin-project/pull/135) @@ -435,19 +443,19 @@ See also [tracking issue for 1.0 release](https://github.com/taiki-e/pin-project ## [0.4.2] - 2019-09-29 -**NOTE:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. +**Note:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. - [Fix support for DSTs(Dynamically Sized Types).](https://github.com/taiki-e/pin-project/pull/113) ## [0.4.1] - 2019-09-26 -**NOTE:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. +**Note:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. - [Fix an issue that caused an error when using `#[pin_project]` on a type that has `#[pin]` + `!Unpin` field with no generics or lifetime.](https://github.com/taiki-e/pin-project/pull/111) ## [0.4.0] - 2019-09-25 -**NOTE:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. +**Note:** This release has been yanked. See [#148](https://github.com/taiki-e/pin-project/pull/148) for details. - [**Pin projection has become a safe operation.**](https://github.com/taiki-e/pin-project/pull/18) In the absence of other unsafe code that you write, it is impossible to cause undefined behavior. @@ -590,7 +598,7 @@ See also [tracking issue for 0.4 release](https://github.com/taiki-e/pin-project ## [0.3.3] - 2019-07-15 -**NOTE:** This release has been yanked. See [#16](https://github.com/taiki-e/pin-project/issues/16) for details. +**Note:** This release has been yanked. See [#16](https://github.com/taiki-e/pin-project/issues/16) for details. - Diagnostic improvements. @@ -664,11 +672,12 @@ See also [tracking issue for 0.4 release](https://github.com/taiki-e/pin-project ## [0.1.0] - 2019-01-08 -**NOTE:** This release has been yanked. +**Note:** This release has been yanked. Initial release -[Unreleased]: https://github.com/taiki-e/pin-project/compare/v1.0.10...HEAD +[Unreleased]: https://github.com/taiki-e/pin-project/compare/v1.0.11...HEAD +[1.0.11]: https://github.com/taiki-e/pin-project/compare/v1.0.10...v1.0.11 [1.0.10]: https://github.com/taiki-e/pin-project/compare/v1.0.9...v1.0.10 [1.0.9]: https://github.com/taiki-e/pin-project/compare/v1.0.8...v1.0.9 [1.0.8]: https://github.com/taiki-e/pin-project/compare/v1.0.7...v1.0.8 diff --git a/Cargo.toml b/Cargo.toml index 120858b9..2fc8af9a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pin-project" -version = "1.0.10" +version = "1.0.11" edition = "2018" rust-version = "1.37" license = "Apache-2.0 OR MIT" @@ -26,11 +26,14 @@ members = [ ] [dependencies] -pin-project-internal = { version = "=1.0.10", path = "pin-project-internal" } +pin-project-internal = { version = "=1.0.11", path = "pin-project-internal" } [dev-dependencies] pin-project-auxiliary-macro = { path = "tests/auxiliary/macro" } -macrotest = "1.0.8" +macrotest = "1.0.9" rustversion = "1" static_assertions = "1" trybuild = "1.0.49" + +[patch.crates-io] +prettyplease = { git = "https://github.com/taiki-e/prettyplease.git", branch = "dev" } # lower MSRV diff --git a/README.md b/README.md index 0e21654f..0a306540 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # pin-project [![crates.io](https://img.shields.io/crates/v/pin-project?style=flat-square&logo=rust)](https://crates.io/crates/pin-project) -[![docs.rs](https://img.shields.io/badge/docs.rs-pin--project-blue?style=flat-square)](https://docs.rs/pin-project) +[![docs.rs](https://img.shields.io/badge/docs.rs-pin--project-blue?style=flat-square&logo=docs.rs)](https://docs.rs/pin-project) [![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/CI/main?style=flat-square&logo=github)](https://github.com/taiki-e/pin-project/actions) @@ -78,17 +78,16 @@ impl Enum { See [documentation](https://docs.rs/pin-project) for more details, and see [examples] directory for more examples and generated code. -[`pin_project`]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html -[enum-default-expanded]: examples/enum-default-expanded.rs -[examples]: examples/README.md -[pin-projection]: https://doc.rust-lang.org/std/pin/index.html#projections-and-structural-pinning -[struct-default-expanded]: examples/struct-default-expanded.rs - ## Related Projects - [pin-project-lite]: A lightweight version of pin-project written with declarative macros. +[`pin_project`]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html +[enum-default-expanded]: examples/enum-default-expanded.rs +[examples]: examples/README.md [pin-project-lite]: https://github.com/taiki-e/pin-project-lite +[pin-projection]: https://doc.rust-lang.org/std/pin/index.html#projections-and-structural-pinning +[struct-default-expanded]: examples/struct-default-expanded.rs ## License diff --git a/ci/publish.sh b/ci/publish.sh index aac94171..03518b9b 100755 --- a/ci/publish.sh +++ b/ci/publish.sh @@ -1,7 +1,7 @@ #!/bin/bash - set -euxo pipefail IFS=$'\n\t' +cd "$(dirname "$0")"/.. # A list of paths to the crate to be published. # It will be published in the order listed. @@ -10,8 +10,6 @@ MEMBERS=( "." ) -cd "$(cd "$(dirname "$0")" && pwd)"/.. - for i in "${!MEMBERS[@]}"; do ( cd "${MEMBERS[${i}]}" diff --git a/examples/README.md b/examples/README.md index 9324dc62..0f30a7fc 100644 --- a/examples/README.md +++ b/examples/README.md @@ -26,7 +26,7 @@ - [example](project_replace.rs) - [generated code](project_replace-expanded.rs) -- [`project_replace()` documentation](https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#project_replace) +- [`project_replace()` documentation](https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#project_replace-method) ### Ensure `!Unpin` by `#[pin_project(!Unpin)]` @@ -35,5 +35,5 @@ - [`!Unpin` documentation](https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unpin) Note: These generated code examples are the little simplified version of the -actual generated code. See [expansion tests](../tests/expand/README.md) if you +actual generated code. See [expansion tests](../tests#expansion-tests-expand-expandtestrs) if you want to see the exact version of the actual generated code. diff --git a/pin-project-internal/Cargo.toml b/pin-project-internal/Cargo.toml index 78c2f449..3faa8ccb 100644 --- a/pin-project-internal/Cargo.toml +++ b/pin-project-internal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pin-project-internal" -version = "1.0.10" +version = "1.0.11" edition = "2018" license = "Apache-2.0 OR MIT" repository = "https://github.com/taiki-e/pin-project" diff --git a/pin-project-internal/src/pin_project/derive.rs b/pin-project-internal/src/pin_project/derive.rs index 3e578f78..39a0b61f 100644 --- a/pin-project-internal/src/pin_project/derive.rs +++ b/pin-project-internal/src/pin_project/derive.rs @@ -514,7 +514,7 @@ fn visit_variants<'a>(cx: &mut Context<'a>, variants: &'a Variants) -> Result visit_fields(cx, Some(ident), fields, Delimiter::Parenthesis)?, Fields::Unit => ProjectedFields { proj_own_body: proj_own_body(cx, Some(ident), None, &[]), - ..ProjectedFields::default() + ..Default::default() }, }; @@ -933,8 +933,14 @@ fn make_proj_impl( let orig_ty_generics = cx.orig.generics.split_for_impl().1; let proj_ty_generics = cx.proj.generics.split_for_impl().1; let (impl_generics, ty_generics, where_clause) = cx.orig.generics.split_for_impl(); + // TODO: For enums and project_replace, dead_code warnings should not be + // allowed because methods are not generated unless explicitly specified. + // However, there is currently no good way to allow warnings for generated + // code, so we allow warnings for all methods for now. + let allow_dead_code = quote! { #[allow(dead_code)] }; let mut project = Some(quote! { + #allow_dead_code #vis fn project<#lifetime>( self: _pin_project::__private::Pin<&#lifetime mut Self>, ) -> #proj_ident #proj_ty_generics { @@ -944,6 +950,7 @@ fn make_proj_impl( } }); let mut project_ref = Some(quote! { + #allow_dead_code #[allow(clippy::missing_const_for_fn)] #vis fn project_ref<#lifetime>( self: _pin_project::__private::Pin<&#lifetime Self>, @@ -956,6 +963,7 @@ fn make_proj_impl( let mut project_replace = cx.project_replace.span().map(|span| { // It is enough to only set the span of the signature. let sig = quote_spanned! { span => + #allow_dead_code #vis fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, @@ -1084,12 +1092,6 @@ fn ensure_not_packed(orig: &OriginalType<'_>, fields: Option<&Fields>) -> Result // See also https://github.com/taiki-e/pin-project/pull/34. // // Note: - // - pin-project v0.4.3 or later (#135, v0.4.0-v0.4.2 are already yanked for - // another reason) is internally proc-macro-derive, so they are not - // affected by the problem that the struct definition is rewritten by - // another macro after the #[pin_project] is expanded. - // So this is probably no longer necessary, but it keeps it for now. - // // - Lint-based tricks aren't perfect, but they're much better than nothing: // https://github.com/taiki-e/pin-project-lite/issues/26 // diff --git a/tests/auxiliary/macro/lib.rs b/tests/auxiliary/macro/lib.rs index 0e133f71..e81a7236 100644 --- a/tests/auxiliary/macro/lib.rs +++ b/tests/auxiliary/macro/lib.rs @@ -12,8 +12,17 @@ fn tokens2(tokens: TokenStream) -> proc_macro2::TokenStream { #[proc_macro_attribute] pub fn hidden_repr(args: TokenStream, input: TokenStream) -> TokenStream { - let (args, input) = (tokens2(args), tokens2(input)); - quote!(#[repr(#args)] #input).into() + let args = tokens2(args); + let mut item = syn::parse_macro_input!(input as ItemStruct); + item.attrs.push(parse_quote!(#[repr(#args)])); + quote!(#item).into() +} + +#[proc_macro_attribute] +pub fn hidden_repr2(_args: TokenStream, input: TokenStream) -> TokenStream { + let mut item = syn::parse_macro_input!(input as ItemStruct); + item.attrs.push(parse_quote!(#[auxiliary_macro::hidden_repr(packed)] )); + quote!(#item).into() } #[proc_macro] diff --git a/tests/compiletest.rs b/tests/compiletest.rs index 70d23589..b06e1e8f 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -12,4 +12,5 @@ fn ui() { let t = trybuild::TestCases::new(); t.compile_fail("tests/ui/**/*.rs"); + t.pass("tests/run-pass/**/*.rs"); } diff --git a/tests/expand/default/enum.expanded.rs b/tests/expand/default/enum.expanded.rs index a3b03385..a50be649 100644 --- a/tests/expand/default/enum.expanded.rs +++ b/tests/expand/default/enum.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project = EnumProj , project_ref = EnumProjRef))] +#[pin(__private(project = EnumProj, project_ref = EnumProjRef))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -46,10 +42,7 @@ enum EnumProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -70,34 +63,46 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> EnumProj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => EnumProj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProj::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProj::Unit, } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> EnumProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => EnumProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProjRef::Unit, } @@ -116,15 +121,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/default/struct.expanded.rs b/tests/expand/default/struct.expanded.rs index 3089a545..9c4e56f1 100644 --- a/tests/expand/default/struct.expanded.rs +++ b/tests/expand/default/struct.expanded.rs @@ -40,6 +40,7 @@ const _: () = { unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -51,6 +52,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -80,15 +82,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/default/tuple_struct.expanded.rs b/tests/expand/default/tuple_struct.expanded.rs index cc9b75e6..eb9a885a 100644 --- a/tests/expand/default/tuple_struct.expanded.rs +++ b/tests/expand/default/tuple_struct.expanded.rs @@ -34,21 +34,29 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -68,15 +76,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/multifields/enum.expanded.rs b/tests/expand/multifields/enum.expanded.rs index fd31201b..cb6b8a5c 100644 --- a/tests/expand/multifields/enum.expanded.rs +++ b/tests/expand/multifields/enum.expanded.rs @@ -1,14 +1,13 @@ use pin_project::pin_project; -# [pin (__private (project = EnumProj , project_ref = EnumProjRef , project_replace = EnumProjOwn))] +#[pin( + __private( + project = EnumProj, + project_ref = EnumProjRef, + project_replace = EnumProjOwn + ) +)] enum Enum { - Struct { - #[pin] - pinned1: T, - #[pin] - pinned2: T, - unpinned1: U, - unpinned2: U, - }, + Struct { #[pin] pinned1: T, #[pin] pinned2: T, unpinned1: U, unpinned2: U }, Tuple(#[pin] T, #[pin] T, U, U), Unit, } @@ -114,74 +113,80 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> EnumProj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { - pinned1, - pinned2, - unpinned1, - unpinned2, - } => EnumProj::Struct { - pinned1: _pin_project::__private::Pin::new_unchecked(pinned1), - pinned2: _pin_project::__private::Pin::new_unchecked(pinned2), - unpinned1, - unpinned2, - }, - Self::Tuple(_0, _1, _2, _3) => EnumProj::Tuple( - _pin_project::__private::Pin::new_unchecked(_0), - _pin_project::__private::Pin::new_unchecked(_1), - _2, - _3, - ), + Self::Struct { pinned1, pinned2, unpinned1, unpinned2 } => { + EnumProj::Struct { + pinned1: _pin_project::__private::Pin::new_unchecked( + pinned1, + ), + pinned2: _pin_project::__private::Pin::new_unchecked( + pinned2, + ), + unpinned1, + unpinned2, + } + } + Self::Tuple(_0, _1, _2, _3) => { + EnumProj::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _pin_project::__private::Pin::new_unchecked(_1), + _2, + _3, + ) + } Self::Unit => EnumProj::Unit, } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> EnumProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { - pinned1, - pinned2, - unpinned1, - unpinned2, - } => EnumProjRef::Struct { - pinned1: _pin_project::__private::Pin::new_unchecked(pinned1), - pinned2: _pin_project::__private::Pin::new_unchecked(pinned2), - unpinned1, - unpinned2, - }, - Self::Tuple(_0, _1, _2, _3) => EnumProjRef::Tuple( - _pin_project::__private::Pin::new_unchecked(_0), - _pin_project::__private::Pin::new_unchecked(_1), - _2, - _3, - ), + Self::Struct { pinned1, pinned2, unpinned1, unpinned2 } => { + EnumProjRef::Struct { + pinned1: _pin_project::__private::Pin::new_unchecked( + pinned1, + ), + pinned2: _pin_project::__private::Pin::new_unchecked( + pinned2, + ), + unpinned1, + unpinned2, + } + } + Self::Tuple(_0, _1, _2, _3) => { + EnumProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _pin_project::__private::Pin::new_unchecked(_1), + _2, + _3, + ) + } Self::Unit => EnumProjRef::Unit, } } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> EnumProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); match &mut *__self_ptr { - Self::Struct { - pinned1, - pinned2, - unpinned1, - unpinned2, - } => { + Self::Struct { pinned1, pinned2, unpinned1, unpinned2 } => { let __result = EnumProjOwn::Struct { pinned1: _pin_project::__private::PhantomData, pinned2: _pin_project::__private::PhantomData, @@ -189,10 +194,12 @@ const _: () = { unpinned2: _pin_project::__private::ptr::read(unpinned2), }; { - let __guard = - _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned2); - let __guard = - _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned1); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned2, + ); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned1, + ); } __result } @@ -204,8 +211,12 @@ const _: () = { _pin_project::__private::ptr::read(_3), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_1); - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _1, + ); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -232,15 +243,15 @@ const _: () = { __field2: T, __field3: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/multifields/struct.expanded.rs b/tests/expand/multifields/struct.expanded.rs index 7ed1f3e7..3ca6cceb 100644 --- a/tests/expand/multifields/struct.expanded.rs +++ b/tests/expand/multifields/struct.expanded.rs @@ -54,16 +54,13 @@ const _: () = { unpinned2: U, } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { unsafe { - let Self { - pinned1, - pinned2, - unpinned1, - unpinned2, - } = self.get_unchecked_mut(); + let Self { pinned1, pinned2, unpinned1, unpinned2 } = self + .get_unchecked_mut(); __StructProjection { pinned1: _pin_project::__private::Pin::new_unchecked(pinned1), pinned2: _pin_project::__private::Pin::new_unchecked(pinned2), @@ -72,17 +69,13 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __StructProjectionRef<'pin, T, U> { unsafe { - let Self { - pinned1, - pinned2, - unpinned1, - unpinned2, - } = self.get_ref(); + let Self { pinned1, pinned2, unpinned1, unpinned2 } = self.get_ref(); __StructProjectionRef { pinned1: _pin_project::__private::Pin::new_unchecked(pinned1), pinned2: _pin_project::__private::Pin::new_unchecked(pinned2), @@ -91,20 +84,18 @@ const _: () = { } } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> __StructProjectionOwned { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); - let Self { - pinned1, - pinned2, - unpinned1, - unpinned2, - } = &mut *__self_ptr; + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); + let Self { pinned1, pinned2, unpinned1, unpinned2 } = &mut *__self_ptr; let __result = __StructProjectionOwned { pinned1: _pin_project::__private::PhantomData, pinned2: _pin_project::__private::PhantomData, @@ -112,8 +103,12 @@ const _: () = { unpinned2: _pin_project::__private::ptr::read(unpinned2), }; { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned2); - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned1); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned2, + ); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned1, + ); } __result } @@ -138,15 +133,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/multifields/tuple_struct.expanded.rs b/tests/expand/multifields/tuple_struct.expanded.rs index 351c084c..a8513415 100644 --- a/tests/expand/multifields/tuple_struct.expanded.rs +++ b/tests/expand/multifields/tuple_struct.expanded.rs @@ -45,6 +45,7 @@ const _: () = { U, ); impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { @@ -58,6 +59,7 @@ const _: () = { ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -72,14 +74,17 @@ const _: () = { ) } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> __TupleStructProjectionOwned { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self(_0, _1, _2, _3) = &mut *__self_ptr; let __result = __TupleStructProjectionOwned( _pin_project::__private::PhantomData, @@ -88,8 +93,12 @@ const _: () = { _pin_project::__private::ptr::read(_3), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_1); - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _1, + ); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -114,15 +123,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/naming/enum-all.expanded.rs b/tests/expand/naming/enum-all.expanded.rs index 7259a13a..ef6e6748 100644 --- a/tests/expand/naming/enum-all.expanded.rs +++ b/tests/expand/naming/enum-all.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project = Proj , project_ref = ProjRef , project_replace = ProjOwn))] +#[pin(__private(project = Proj, project_ref = ProjRef, project_replace = ProjOwn))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -46,10 +42,7 @@ enum ProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -66,10 +59,7 @@ where #[allow(variant_size_differences)] #[allow(clippy::large_enum_variant)] enum ProjOwn { - Struct { - pinned: ::pin_project::__private::PhantomData, - unpinned: U, - }, + Struct { pinned: ::pin_project::__private::PhantomData, unpinned: U }, Tuple(::pin_project::__private::PhantomData, U), Unit, } @@ -90,13 +80,18 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { - fn project<'pin>(self: _pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> { + #[allow(dead_code)] + fn project<'pin>( + self: _pin_project::__private::Pin<&'pin mut Self>, + ) -> Proj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => Proj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + Proj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { Proj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) } @@ -104,31 +99,40 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> ProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => ProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + ProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - ProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + ProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => ProjRef::Unit, } } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> ProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); match &mut *__self_ptr { Self::Struct { pinned, unpinned } => { let __result = ProjOwn::Struct { @@ -136,8 +140,9 @@ const _: () = { unpinned: _pin_project::__private::ptr::read(unpinned), }; { - let __guard = - _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned, + ); } __result } @@ -147,7 +152,9 @@ const _: () = { _pin_project::__private::ptr::read(_1), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -172,15 +179,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/naming/enum-mut.expanded.rs b/tests/expand/naming/enum-mut.expanded.rs index 09271fdc..c16cd9ad 100644 --- a/tests/expand/naming/enum-mut.expanded.rs +++ b/tests/expand/naming/enum-mut.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project = Proj))] +#[pin(__private(project = Proj))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -48,13 +44,18 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { - fn project<'pin>(self: _pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> { + #[allow(dead_code)] + fn project<'pin>( + self: _pin_project::__private::Pin<&'pin mut Self>, + ) -> Proj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => Proj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + Proj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { Proj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) } @@ -75,15 +76,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/naming/enum-none.expanded.rs b/tests/expand/naming/enum-none.expanded.rs index 54cd1f8c..756fd6a3 100644 --- a/tests/expand/naming/enum-none.expanded.rs +++ b/tests/expand/naming/enum-none.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; #[pin(__private())] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -38,15 +34,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/naming/enum-own.expanded.rs b/tests/expand/naming/enum-own.expanded.rs index 19ec570c..e6cf5396 100644 --- a/tests/expand/naming/enum-own.expanded.rs +++ b/tests/expand/naming/enum-own.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project_replace = ProjOwn))] +#[pin(__private(project_replace = ProjOwn))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -22,10 +18,7 @@ enum Enum { #[allow(variant_size_differences)] #[allow(clippy::large_enum_variant)] enum ProjOwn { - Struct { - pinned: ::pin_project::__private::PhantomData, - unpinned: U, - }, + Struct { pinned: ::pin_project::__private::PhantomData, unpinned: U }, Tuple(::pin_project::__private::PhantomData, U), Unit, } @@ -46,14 +39,17 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> ProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); match &mut *__self_ptr { Self::Struct { pinned, unpinned } => { let __result = ProjOwn::Struct { @@ -61,8 +57,9 @@ const _: () = { unpinned: _pin_project::__private::ptr::read(unpinned), }; { - let __guard = - _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned, + ); } __result } @@ -72,7 +69,9 @@ const _: () = { _pin_project::__private::ptr::read(_1), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -97,15 +96,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/naming/enum-ref.expanded.rs b/tests/expand/naming/enum-ref.expanded.rs index 4565d084..19a0a32e 100644 --- a/tests/expand/naming/enum-ref.expanded.rs +++ b/tests/expand/naming/enum-ref.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project_ref = ProjRef))] +#[pin(__private(project_ref = ProjRef))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -24,10 +20,7 @@ enum ProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -48,18 +41,24 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> ProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => ProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + ProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - ProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + ProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => ProjRef::Unit, } @@ -78,15 +77,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/naming/struct-all.expanded.rs b/tests/expand/naming/struct-all.expanded.rs index 4b46e349..abd2998a 100644 --- a/tests/expand/naming/struct-all.expanded.rs +++ b/tests/expand/naming/struct-all.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project = Proj , project_ref = ProjRef , project_replace = ProjOwn))] +#[pin(__private(project = Proj, project_ref = ProjRef, project_replace = ProjOwn))] struct Struct { #[pin] pinned: T, @@ -72,7 +72,10 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Struct { - fn project<'pin>(self: _pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> { + #[allow(dead_code)] + fn project<'pin>( + self: _pin_project::__private::Pin<&'pin mut Self>, + ) -> Proj<'pin, T, U> { unsafe { let Self { pinned, unpinned } = self.get_unchecked_mut(); Proj { @@ -81,6 +84,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -93,21 +97,26 @@ const _: () = { } } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> ProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self { pinned, unpinned } = &mut *__self_ptr; let __result = ProjOwn { pinned: _pin_project::__private::PhantomData, unpinned: _pin_project::__private::ptr::read(unpinned), }; { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned, + ); } __result } @@ -129,15 +138,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/naming/struct-mut.expanded.rs b/tests/expand/naming/struct-mut.expanded.rs index 5803d6b2..082c2549 100644 --- a/tests/expand/naming/struct-mut.expanded.rs +++ b/tests/expand/naming/struct-mut.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project = Proj))] +#[pin(__private(project = Proj))] struct Struct { #[pin] pinned: T, @@ -49,7 +49,10 @@ const _: () = { unpinned: &'pin (U), } impl Struct { - fn project<'pin>(self: _pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> { + #[allow(dead_code)] + fn project<'pin>( + self: _pin_project::__private::Pin<&'pin mut Self>, + ) -> Proj<'pin, T, U> { unsafe { let Self { pinned, unpinned } = self.get_unchecked_mut(); Proj { @@ -58,6 +61,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -87,15 +91,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/naming/struct-none.expanded.rs b/tests/expand/naming/struct-none.expanded.rs index 3089a545..9c4e56f1 100644 --- a/tests/expand/naming/struct-none.expanded.rs +++ b/tests/expand/naming/struct-none.expanded.rs @@ -40,6 +40,7 @@ const _: () = { unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -51,6 +52,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -80,15 +82,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/naming/struct-own.expanded.rs b/tests/expand/naming/struct-own.expanded.rs index d05c7d6e..cc8aba36 100644 --- a/tests/expand/naming/struct-own.expanded.rs +++ b/tests/expand/naming/struct-own.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project_replace = ProjOwn))] +#[pin(__private(project_replace = ProjOwn))] struct Struct { #[pin] pinned: T, @@ -54,6 +54,7 @@ const _: () = { unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -65,6 +66,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -77,21 +79,26 @@ const _: () = { } } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> ProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self { pinned, unpinned } = &mut *__self_ptr; let __result = ProjOwn { pinned: _pin_project::__private::PhantomData, unpinned: _pin_project::__private::ptr::read(unpinned), }; { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned, + ); } __result } @@ -113,15 +120,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/naming/struct-ref.expanded.rs b/tests/expand/naming/struct-ref.expanded.rs index c131ec49..b714ea57 100644 --- a/tests/expand/naming/struct-ref.expanded.rs +++ b/tests/expand/naming/struct-ref.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project_ref = ProjRef))] +#[pin(__private(project_ref = ProjRef))] struct Struct { #[pin] pinned: T, @@ -49,6 +49,7 @@ const _: () = { unpinned: &'pin mut (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -60,6 +61,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -89,15 +91,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/naming/tuple_struct-all.expanded.rs b/tests/expand/naming/tuple_struct-all.expanded.rs index 042a798c..3b2aa914 100644 --- a/tests/expand/naming/tuple_struct-all.expanded.rs +++ b/tests/expand/naming/tuple_struct-all.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project = Proj , project_ref = ProjRef , project_replace = ProjOwn))] +#[pin(__private(project = Proj, project_ref = ProjRef, project_replace = ProjOwn))] struct TupleStruct(#[pin] T, U); #[allow(box_pointers)] #[allow(deprecated)] @@ -12,7 +12,10 @@ struct TupleStruct(#[pin] T, U); #[allow(clippy::type_repetition_in_bounds)] #[allow(dead_code)] #[allow(clippy::mut_mut)] -struct Proj<'pin, T, U>(::pin_project::__private::Pin<&'pin mut (T)>, &'pin mut (U)) +struct Proj<'pin, T, U>( + ::pin_project::__private::Pin<&'pin mut (T)>, + &'pin mut (U), +) where TupleStruct: 'pin; #[allow(box_pointers)] @@ -26,7 +29,10 @@ where #[allow(clippy::type_repetition_in_bounds)] #[allow(dead_code)] #[allow(clippy::ref_option_ref)] -struct ProjRef<'pin, T, U>(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)) +struct ProjRef<'pin, T, U>( + ::pin_project::__private::Pin<&'pin (T)>, + &'pin (U), +) where TupleStruct: 'pin; #[allow(box_pointers)] @@ -57,12 +63,16 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl TupleStruct { - fn project<'pin>(self: _pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> { + #[allow(dead_code)] + fn project<'pin>( + self: _pin_project::__private::Pin<&'pin mut Self>, + ) -> Proj<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); Proj(_pin_project::__private::Pin::new_unchecked(_0), _1) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -72,21 +82,26 @@ const _: () = { ProjRef(_pin_project::__private::Pin::new_unchecked(_0), _1) } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> ProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self(_0, _1) = &mut *__self_ptr; let __result = ProjOwn( _pin_project::__private::PhantomData, _pin_project::__private::ptr::read(_1), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -108,15 +123,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/naming/tuple_struct-mut.expanded.rs b/tests/expand/naming/tuple_struct-mut.expanded.rs index 60218d6c..33eedea7 100644 --- a/tests/expand/naming/tuple_struct-mut.expanded.rs +++ b/tests/expand/naming/tuple_struct-mut.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project = Proj))] +#[pin(__private(project = Proj))] struct TupleStruct(#[pin] T, U); #[allow(box_pointers)] #[allow(deprecated)] @@ -12,7 +12,10 @@ struct TupleStruct(#[pin] T, U); #[allow(clippy::type_repetition_in_bounds)] #[allow(dead_code)] #[allow(clippy::mut_mut)] -struct Proj<'pin, T, U>(::pin_project::__private::Pin<&'pin mut (T)>, &'pin mut (U)) +struct Proj<'pin, T, U>( + ::pin_project::__private::Pin<&'pin mut (T)>, + &'pin mut (U), +) where TupleStruct: 'pin; #[allow(box_pointers)] @@ -40,19 +43,26 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { - fn project<'pin>(self: _pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> { + #[allow(dead_code)] + fn project<'pin>( + self: _pin_project::__private::Pin<&'pin mut Self>, + ) -> Proj<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); Proj(_pin_project::__private::Pin::new_unchecked(_0), _1) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -72,15 +82,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/naming/tuple_struct-none.expanded.rs b/tests/expand/naming/tuple_struct-none.expanded.rs index cc9b75e6..eb9a885a 100644 --- a/tests/expand/naming/tuple_struct-none.expanded.rs +++ b/tests/expand/naming/tuple_struct-none.expanded.rs @@ -34,21 +34,29 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -68,15 +76,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/naming/tuple_struct-own.expanded.rs b/tests/expand/naming/tuple_struct-own.expanded.rs index 21e12de6..76aae178 100644 --- a/tests/expand/naming/tuple_struct-own.expanded.rs +++ b/tests/expand/naming/tuple_struct-own.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project_replace = ProjOwn))] +#[pin(__private(project_replace = ProjOwn))] struct TupleStruct(#[pin] T, U); #[allow(box_pointers)] #[allow(deprecated)] @@ -45,38 +45,51 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> ProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self(_0, _1) = &mut *__self_ptr; let __result = ProjOwn( _pin_project::__private::PhantomData, _pin_project::__private::ptr::read(_1), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -98,15 +111,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/naming/tuple_struct-ref.expanded.rs b/tests/expand/naming/tuple_struct-ref.expanded.rs index ea11b6a2..4c06eb0f 100644 --- a/tests/expand/naming/tuple_struct-ref.expanded.rs +++ b/tests/expand/naming/tuple_struct-ref.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (project_ref = ProjRef))] +#[pin(__private(project_ref = ProjRef))] struct TupleStruct(#[pin] T, U); #[allow(box_pointers)] #[allow(deprecated)] @@ -12,7 +12,10 @@ struct TupleStruct(#[pin] T, U); #[allow(clippy::type_repetition_in_bounds)] #[allow(dead_code)] #[allow(clippy::ref_option_ref)] -struct ProjRef<'pin, T, U>(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)) +struct ProjRef<'pin, T, U>( + ::pin_project::__private::Pin<&'pin (T)>, + &'pin (U), +) where TupleStruct: 'pin; #[allow(box_pointers)] @@ -40,14 +43,19 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -74,15 +82,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/not_unpin/enum.expanded.rs b/tests/expand/not_unpin/enum.expanded.rs index 5173b545..c279d216 100644 --- a/tests/expand/not_unpin/enum.expanded.rs +++ b/tests/expand/not_unpin/enum.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (! Unpin , project = EnumProj , project_ref = EnumProjRef))] +#[pin(__private(!Unpin, project = EnumProj, project_ref = EnumProjRef))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -46,10 +42,7 @@ enum EnumProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -70,51 +63,67 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> EnumProj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => EnumProj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProj::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProj::Unit, } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> EnumProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => EnumProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProjRef::Unit, } } } } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - _pin_project::__private::Wrapper<'pin, _pin_project::__private::PhantomPinned>: - _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + _pin_project::__private::Wrapper< + 'pin, + _pin_project::__private::PhantomPinned, + >: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - _pin_project::__private::Wrapper<'pin, _pin_project::__private::PhantomPinned>: - _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + _pin_project::__private::Wrapper< + 'pin, + _pin_project::__private::PhantomPinned, + >: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/not_unpin/struct.expanded.rs b/tests/expand/not_unpin/struct.expanded.rs index e9d89225..85bb5f96 100644 --- a/tests/expand/not_unpin/struct.expanded.rs +++ b/tests/expand/not_unpin/struct.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (! Unpin))] +#[pin(__private(!Unpin))] struct Struct { #[pin] pinned: T, @@ -40,6 +40,7 @@ const _: () = { unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -51,6 +52,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -69,17 +71,21 @@ const _: () = { let _ = &this.pinned; let _ = &this.unpinned; } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - _pin_project::__private::Wrapper<'pin, _pin_project::__private::PhantomPinned>: - _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + _pin_project::__private::Wrapper< + 'pin, + _pin_project::__private::PhantomPinned, + >: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - _pin_project::__private::Wrapper<'pin, _pin_project::__private::PhantomPinned>: - _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + _pin_project::__private::Wrapper< + 'pin, + _pin_project::__private::PhantomPinned, + >: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/not_unpin/tuple_struct.expanded.rs b/tests/expand/not_unpin/tuple_struct.expanded.rs index cefb61db..2b1bbe18 100644 --- a/tests/expand/not_unpin/tuple_struct.expanded.rs +++ b/tests/expand/not_unpin/tuple_struct.expanded.rs @@ -1,5 +1,5 @@ use pin_project::pin_project; -# [pin (__private (! Unpin))] +#[pin(__private(!Unpin))] struct TupleStruct(#[pin] T, U); #[allow(box_pointers)] #[allow(deprecated)] @@ -34,21 +34,29 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -57,17 +65,21 @@ const _: () = { let _ = &this.0; let _ = &this.1; } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - _pin_project::__private::Wrapper<'pin, _pin_project::__private::PhantomPinned>: - _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + _pin_project::__private::Wrapper< + 'pin, + _pin_project::__private::PhantomPinned, + >: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - _pin_project::__private::Wrapper<'pin, _pin_project::__private::PhantomPinned>: - _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + _pin_project::__private::Wrapper< + 'pin, + _pin_project::__private::PhantomPinned, + >: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/pinned_drop/enum.expanded.rs b/tests/expand/pinned_drop/enum.expanded.rs index e1bc486b..6074790b 100644 --- a/tests/expand/pinned_drop/enum.expanded.rs +++ b/tests/expand/pinned_drop/enum.expanded.rs @@ -1,12 +1,8 @@ use std::pin::Pin; use pin_project::{pin_project, pinned_drop}; -# [pin (__private (PinnedDrop , project = EnumProj , project_ref = EnumProjRef))] +#[pin(__private(PinnedDrop, project = EnumProj, project_ref = EnumProjRef))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -47,10 +43,7 @@ enum EnumProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -71,34 +64,46 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> EnumProj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => EnumProj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProj::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProj::Unit, } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> EnumProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => EnumProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProjRef::Unit, } @@ -117,15 +122,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} impl _pin_project::__private::Drop for Enum { fn drop(&mut self) { unsafe { diff --git a/tests/expand/pinned_drop/struct.expanded.rs b/tests/expand/pinned_drop/struct.expanded.rs index 22274429..3711086a 100644 --- a/tests/expand/pinned_drop/struct.expanded.rs +++ b/tests/expand/pinned_drop/struct.expanded.rs @@ -41,6 +41,7 @@ const _: () = { unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -52,6 +53,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -81,15 +83,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} impl _pin_project::__private::Drop for Struct { fn drop(&mut self) { unsafe { diff --git a/tests/expand/pinned_drop/tuple_struct.expanded.rs b/tests/expand/pinned_drop/tuple_struct.expanded.rs index 8c7433e7..60b7f8a6 100644 --- a/tests/expand/pinned_drop/tuple_struct.expanded.rs +++ b/tests/expand/pinned_drop/tuple_struct.expanded.rs @@ -35,21 +35,29 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -69,15 +77,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} impl _pin_project::__private::Drop for TupleStruct { fn drop(&mut self) { unsafe { diff --git a/tests/expand/project_replace/enum.expanded.rs b/tests/expand/project_replace/enum.expanded.rs index d2b2094a..0837202b 100644 --- a/tests/expand/project_replace/enum.expanded.rs +++ b/tests/expand/project_replace/enum.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project_replace = EnumProjOwn))] +#[pin(__private(project_replace = EnumProjOwn))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -22,10 +18,7 @@ enum Enum { #[allow(variant_size_differences)] #[allow(clippy::large_enum_variant)] enum EnumProjOwn { - Struct { - pinned: ::pin_project::__private::PhantomData, - unpinned: U, - }, + Struct { pinned: ::pin_project::__private::PhantomData, unpinned: U }, Tuple(::pin_project::__private::PhantomData, U), Unit, } @@ -46,14 +39,17 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> EnumProjOwn { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); match &mut *__self_ptr { Self::Struct { pinned, unpinned } => { let __result = EnumProjOwn::Struct { @@ -61,8 +57,9 @@ const _: () = { unpinned: _pin_project::__private::ptr::read(unpinned), }; { - let __guard = - _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned, + ); } __result } @@ -72,7 +69,9 @@ const _: () = { _pin_project::__private::ptr::read(_1), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -97,15 +96,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/project_replace/struct.expanded.rs b/tests/expand/project_replace/struct.expanded.rs index aa5fd54f..3510ee5a 100644 --- a/tests/expand/project_replace/struct.expanded.rs +++ b/tests/expand/project_replace/struct.expanded.rs @@ -45,6 +45,7 @@ const _: () = { unpinned: U, } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -56,6 +57,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -68,21 +70,26 @@ const _: () = { } } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> __StructProjectionOwned { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self { pinned, unpinned } = &mut *__self_ptr; let __result = __StructProjectionOwned { pinned: _pin_project::__private::PhantomData, unpinned: _pin_project::__private::ptr::read(unpinned), }; { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(pinned); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + pinned, + ); } __result } @@ -104,15 +111,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/project_replace/tuple_struct.expanded.rs b/tests/expand/project_replace/tuple_struct.expanded.rs index 529f0b24..42b72f0c 100644 --- a/tests/expand/project_replace/tuple_struct.expanded.rs +++ b/tests/expand/project_replace/tuple_struct.expanded.rs @@ -34,40 +34,56 @@ const _: () = { where TupleStruct: 'pin; #[allow(dead_code)] - struct __TupleStructProjectionOwned(::pin_project::__private::PhantomData, U); + struct __TupleStructProjectionOwned( + ::pin_project::__private::PhantomData, + U, + ); impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] fn project_replace( self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> __TupleStructProjectionOwned { unsafe { let __self_ptr: *mut Self = self.get_unchecked_mut(); - let __guard = - _pin_project::__private::UnsafeOverwriteGuard::new(__self_ptr, __replacement); + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); let Self(_0, _1) = &mut *__self_ptr; let __result = __TupleStructProjectionOwned( _pin_project::__private::PhantomData, _pin_project::__private::ptr::read(_1), ); { - let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(_0); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new( + _0, + ); } __result } @@ -89,15 +105,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/pub/enum.expanded.rs b/tests/expand/pub/enum.expanded.rs index 530eca94..4c0db2ab 100644 --- a/tests/expand/pub/enum.expanded.rs +++ b/tests/expand/pub/enum.expanded.rs @@ -1,11 +1,7 @@ use pin_project::pin_project; -# [pin (__private (project = EnumProj , project_ref = EnumProjRef))] +#[pin(__private(project = EnumProj, project_ref = EnumProjRef))] pub enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -46,10 +42,7 @@ pub(crate) enum EnumProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -70,34 +63,46 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] pub(crate) fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> EnumProj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => EnumProj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProj::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProj::Unit, } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] pub(crate) fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> EnumProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => EnumProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProjRef::Unit, } @@ -116,15 +121,15 @@ const _: () = { __field0: T, __field1: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum where - __Enum<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Enum + where + __Enum<'pin, T, U>: _pin_project::__private::Unpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/pub/struct.expanded.rs b/tests/expand/pub/struct.expanded.rs index 71ae3a3b..e9749b29 100644 --- a/tests/expand/pub/struct.expanded.rs +++ b/tests/expand/pub/struct.expanded.rs @@ -40,6 +40,7 @@ const _: () = { pub unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] pub(crate) fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -51,6 +52,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] pub(crate) fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -80,15 +82,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct where - __Struct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for Struct + where + __Struct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/pub/tuple_struct.expanded.rs b/tests/expand/pub/tuple_struct.expanded.rs index 02c3f24d..adb46199 100644 --- a/tests/expand/pub/tuple_struct.expanded.rs +++ b/tests/expand/pub/tuple_struct.expanded.rs @@ -34,21 +34,29 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] pub(crate) fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] pub(crate) fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -68,15 +76,15 @@ const _: () = { >, __field0: T, } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} #[doc(hidden)] - unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct where - __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin - { - } + unsafe impl<'pin, T, U> _pin_project::UnsafeUnpin for TupleStruct + where + __TupleStruct<'pin, T, U>: _pin_project::__private::Unpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expand/unsafe_unpin/enum.expanded.rs b/tests/expand/unsafe_unpin/enum.expanded.rs index 3d53a1e8..1c1135fa 100644 --- a/tests/expand/unsafe_unpin/enum.expanded.rs +++ b/tests/expand/unsafe_unpin/enum.expanded.rs @@ -1,11 +1,7 @@ use pin_project::{pin_project, UnsafeUnpin}; -# [pin (__private (UnsafeUnpin , project = EnumProj , project_ref = EnumProjRef))] +#[pin(__private(UnsafeUnpin, project = EnumProj, project_ref = EnumProjRef))] enum Enum { - Struct { - #[pin] - pinned: T, - unpinned: U, - }, + Struct { #[pin] pinned: T, unpinned: U }, Tuple(#[pin] T, U), Unit, } @@ -46,10 +42,7 @@ enum EnumProjRef<'pin, T, U> where Enum: 'pin, { - Struct { - pinned: ::pin_project::__private::Pin<&'pin (T)>, - unpinned: &'pin (U), - }, + Struct { pinned: ::pin_project::__private::Pin<&'pin (T)>, unpinned: &'pin (U) }, Tuple(::pin_project::__private::Pin<&'pin (T)>, &'pin (U)), Unit, } @@ -70,44 +63,56 @@ const _: () = { #[allow(unused_extern_crates)] extern crate pin_project as _pin_project; impl Enum { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> EnumProj<'pin, T, U> { unsafe { match self.get_unchecked_mut() { - Self::Struct { pinned, unpinned } => EnumProj::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProj::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProj::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProj::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProj::Unit, } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> EnumProjRef<'pin, T, U> { unsafe { match self.get_ref() { - Self::Struct { pinned, unpinned } => EnumProjRef::Struct { - pinned: _pin_project::__private::Pin::new_unchecked(pinned), - unpinned, - }, + Self::Struct { pinned, unpinned } => { + EnumProjRef::Struct { + pinned: _pin_project::__private::Pin::new_unchecked(pinned), + unpinned, + } + } Self::Tuple(_0, _1) => { - EnumProjRef::Tuple(_pin_project::__private::Pin::new_unchecked(_0), _1) + EnumProjRef::Tuple( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } Self::Unit => EnumProjRef::Unit, } } } } - impl<'pin, T, U> _pin_project::__private::Unpin for Enum where - _pin_project::__private::Wrapper<'pin, Self>: _pin_project::UnsafeUnpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Enum + where + _pin_project::__private::Wrapper<'pin, Self>: _pin_project::UnsafeUnpin, + {} trait EnumMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl EnumMustNotImplDrop for T {} diff --git a/tests/expand/unsafe_unpin/struct.expanded.rs b/tests/expand/unsafe_unpin/struct.expanded.rs index a866ab3c..396b2895 100644 --- a/tests/expand/unsafe_unpin/struct.expanded.rs +++ b/tests/expand/unsafe_unpin/struct.expanded.rs @@ -40,6 +40,7 @@ const _: () = { unpinned: &'pin (U), } impl Struct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __StructProjection<'pin, T, U> { @@ -51,6 +52,7 @@ const _: () = { } } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, @@ -69,10 +71,10 @@ const _: () = { let _ = &this.pinned; let _ = &this.unpinned; } - impl<'pin, T, U> _pin_project::__private::Unpin for Struct where - _pin_project::__private::Wrapper<'pin, Self>: _pin_project::UnsafeUnpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for Struct + where + _pin_project::__private::Wrapper<'pin, Self>: _pin_project::UnsafeUnpin, + {} trait StructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl StructMustNotImplDrop for T {} diff --git a/tests/expand/unsafe_unpin/tuple_struct.expanded.rs b/tests/expand/unsafe_unpin/tuple_struct.expanded.rs index 1a419768..e8349102 100644 --- a/tests/expand/unsafe_unpin/tuple_struct.expanded.rs +++ b/tests/expand/unsafe_unpin/tuple_struct.expanded.rs @@ -34,21 +34,29 @@ const _: () = { where TupleStruct: 'pin; impl TupleStruct { + #[allow(dead_code)] fn project<'pin>( self: _pin_project::__private::Pin<&'pin mut Self>, ) -> __TupleStructProjection<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_unchecked_mut(); - __TupleStructProjection(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjection( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } + #[allow(dead_code)] #[allow(clippy::missing_const_for_fn)] fn project_ref<'pin>( self: _pin_project::__private::Pin<&'pin Self>, ) -> __TupleStructProjectionRef<'pin, T, U> { unsafe { let Self(_0, _1) = self.get_ref(); - __TupleStructProjectionRef(_pin_project::__private::Pin::new_unchecked(_0), _1) + __TupleStructProjectionRef( + _pin_project::__private::Pin::new_unchecked(_0), + _1, + ) } } } @@ -57,10 +65,10 @@ const _: () = { let _ = &this.0; let _ = &this.1; } - impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct where - _pin_project::__private::Wrapper<'pin, Self>: _pin_project::UnsafeUnpin - { - } + impl<'pin, T, U> _pin_project::__private::Unpin for TupleStruct + where + _pin_project::__private::Wrapper<'pin, Self>: _pin_project::UnsafeUnpin, + {} trait TupleStructMustNotImplDrop {} #[allow(clippy::drop_bounds, drop_bounds)] impl TupleStructMustNotImplDrop for T {} diff --git a/tests/expandtest.rs b/tests/expandtest.rs index 3f0d5c11..4feec1a4 100644 --- a/tests/expandtest.rs +++ b/tests/expandtest.rs @@ -13,9 +13,9 @@ const PATH: &str = "tests/expand/**/*.rs"; 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 !has_command(&[cargo, "expand"]) { if is_ci { - panic!("expandtest requires rustfmt and cargo-expand"); + panic!("expandtest requires cargo-expand"); } return; } diff --git a/tests/include/basic.rs b/tests/include/basic.rs index f862c63f..57cbaeb8 100644 --- a/tests/include/basic.rs +++ b/tests/include/basic.rs @@ -1,13 +1,16 @@ include!("basic-safe-part.rs"); +#[allow(clippy::undocumented_unsafe_blocks)] unsafe impl ::pin_project::UnsafeUnpin for UnsafeUnpinStruct { } +#[allow(clippy::undocumented_unsafe_blocks)] unsafe impl ::pin_project::UnsafeUnpin for UnsafeUnpinTupleStruct { } +#[allow(clippy::undocumented_unsafe_blocks)] unsafe impl ::pin_project::UnsafeUnpin for UnsafeUnpinEnum { diff --git a/tests/lint.rs b/tests/lint.rs index 6a75461d..c3ea0995 100644 --- a/tests/lint.rs +++ b/tests/lint.rs @@ -8,14 +8,16 @@ #![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_block_in_unsafe_fn: requires Rust 1.52. and, we don't generate unsafe fn. +// 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: unrelated +// 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, @@ -36,7 +38,7 @@ )] #![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)] // TODO +#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums, clippy::single_char_lifetime_names)] // TODO pub mod basic { include!("include/basic.rs"); @@ -237,14 +239,17 @@ pub mod basic { Unit, } + #[allow(clippy::undocumented_unsafe_blocks)] unsafe impl ::pin_project::UnsafeUnpin for UnsafeUnpinStruct { } + #[allow(clippy::undocumented_unsafe_blocks)] unsafe impl ::pin_project::UnsafeUnpin for UnsafeUnpinTupleStruct { } + #[allow(clippy::undocumented_unsafe_blocks)] unsafe impl ::pin_project::UnsafeUnpin for UnsafeUnpinEnum { @@ -953,6 +958,7 @@ mod clippy_redundant_pub_crate { pub mod inside_macro { use pin_project::pin_project; + #[allow(clippy::redundant_pub_crate)] #[rustfmt::skip] macro_rules! mac { () => { diff --git a/tests/ui/not_unpin/conflict-unpin.stderr b/tests/ui/not_unpin/conflict-unpin.stderr index d644bf78..d79fbfb9 100644 --- a/tests/ui/not_unpin/conflict-unpin.stderr +++ b/tests/ui/not_unpin/conflict-unpin.stderr @@ -5,7 +5,7 @@ error[E0119]: conflicting implementations of trait `std::marker::Unpin` for type | ^^^^^^ conflicting implementation for `Foo<_, _>` ... 10 | impl Unpin for Foo where T: Unpin {} - | --------------------------------------------- first implementation here + | ------------------------------ first implementation here error[E0119]: conflicting implementations of trait `std::marker::Unpin` for type `Bar<_, _>` --> tests/ui/not_unpin/conflict-unpin.rs:12:15 diff --git a/tests/ui/not_unpin/impl-unsafe-unpin.stderr b/tests/ui/not_unpin/impl-unsafe-unpin.stderr index a944e959..93f225eb 100644 --- a/tests/ui/not_unpin/impl-unsafe-unpin.stderr +++ b/tests/ui/not_unpin/impl-unsafe-unpin.stderr @@ -5,7 +5,7 @@ error[E0119]: conflicting implementations of trait `_::_pin_project::UnsafeUnpin | ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Foo<_, _>` ... 10 | unsafe impl UnsafeUnpin for Foo where T: Unpin {} - | ---------------------------------------------------------- first implementation here + | ------------------------------------------- first implementation here | = note: this error originates in the derive macro `::pin_project::__private::__PinProjectInternalDerive` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/pin_project/conflict-unpin.stderr b/tests/ui/pin_project/conflict-unpin.stderr index 5e012c42..7df5db27 100644 --- a/tests/ui/pin_project/conflict-unpin.stderr +++ b/tests/ui/pin_project/conflict-unpin.stderr @@ -5,7 +5,7 @@ error[E0119]: conflicting implementations of trait `std::marker::Unpin` for type | ^^^^^^^^^^^^^^ conflicting implementation for `Foo<_, _>` ... 13 | impl Unpin for Foo where T: Unpin {} // Conditional Unpin impl - | --------------------------------------------- first implementation here + | ------------------------------ first implementation here | = note: this error originates in the derive macro `::pin_project::__private::__PinProjectInternalDerive` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/pin_project/impl-unsafe-unpin.stderr b/tests/ui/pin_project/impl-unsafe-unpin.stderr index ba423038..9554b9b5 100644 --- a/tests/ui/pin_project/impl-unsafe-unpin.stderr +++ b/tests/ui/pin_project/impl-unsafe-unpin.stderr @@ -5,7 +5,7 @@ error[E0119]: conflicting implementations of trait `_::_pin_project::UnsafeUnpin | ^^^^^^^^^^^^^^ conflicting implementation for `Foo<_, _>` ... 10 | unsafe impl UnsafeUnpin for Foo where T: Unpin {} - | ---------------------------------------------------------- first implementation here + | ------------------------------------------- first implementation here | = note: this error originates in the derive macro `::pin_project::__private::__PinProjectInternalDerive` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/pin_project/packed_sneaky-1.rs b/tests/ui/pin_project/packed_sneaky-1.rs index 72d3d3e8..83a46122 100644 --- a/tests/ui/pin_project/packed_sneaky-1.rs +++ b/tests/ui/pin_project/packed_sneaky-1.rs @@ -1,6 +1,6 @@ use std::pin::Pin; -use auxiliary_macro::hidden_repr; +use auxiliary_macro::{hidden_repr, hidden_repr2}; use pin_project::{pin_project, pinned_drop, UnsafeUnpin}; #[pin_project] //~ ERROR may not be used on #[repr(packed)] types @@ -10,6 +10,13 @@ struct A { f: u32, } +#[hidden_repr2] +#[pin_project] //~ ERROR may not be used on #[repr(packed)] types +struct B { + #[pin] + f: u32, +} + #[pin_project(UnsafeUnpin)] //~ ERROR may not be used on #[repr(packed)] types #[hidden_repr(packed)] struct C { diff --git a/tests/ui/pin_project/packed_sneaky-1.stderr b/tests/ui/pin_project/packed_sneaky-1.stderr index 32fe4074..0746e1a2 100644 --- a/tests/ui/pin_project/packed_sneaky-1.stderr +++ b/tests/ui/pin_project/packed_sneaky-1.stderr @@ -5,13 +5,21 @@ error: #[pin_project] attribute may not be used on #[repr(packed)] types | ^^^^^^ error: #[pin_project] attribute may not be used on #[repr(packed)] types - --> tests/ui/pin_project/packed_sneaky-1.rs:14:15 + --> tests/ui/pin_project/packed_sneaky-1.rs:13:1 | -14 | #[hidden_repr(packed)] +13 | #[hidden_repr2] + | ^^^^^^^^^^^^^^^ + | + = note: this error originates in the attribute macro `hidden_repr2` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: #[pin_project] attribute may not be used on #[repr(packed)] types + --> tests/ui/pin_project/packed_sneaky-1.rs:21:15 + | +21 | #[hidden_repr(packed)] | ^^^^^^ error: #[pin_project] attribute may not be used on #[repr(packed)] types - --> tests/ui/pin_project/packed_sneaky-1.rs:23:15 + --> tests/ui/pin_project/packed_sneaky-1.rs:30:15 | -23 | #[hidden_repr(packed)] +30 | #[hidden_repr(packed)] | ^^^^^^ diff --git a/tests/ui/pin_project/packed_sneaky-4.rs b/tests/ui/pin_project/packed_sneaky-4.rs new file mode 100644 index 00000000..fb954baf --- /dev/null +++ b/tests/ui/pin_project/packed_sneaky-4.rs @@ -0,0 +1,15 @@ +// https://github.com/taiki-e/pin-project/issues/342 + +#![allow(unaligned_references)] + +use auxiliary_macro::hidden_repr2; +use pin_project::pin_project; + +#[pin_project] //~ ERROR reference to packed field is unaligned +#[hidden_repr2] +struct A { + #[pin] + f: u32, +} + +fn main() {} diff --git a/tests/ui/pin_project/packed_sneaky-4.stderr b/tests/ui/pin_project/packed_sneaky-4.stderr new file mode 100644 index 00000000..8072ce2f --- /dev/null +++ b/tests/ui/pin_project/packed_sneaky-4.stderr @@ -0,0 +1,16 @@ +error: reference to packed field is unaligned + --> tests/ui/pin_project/packed_sneaky-4.rs:8:1 + | +8 | #[pin_project] //~ ERROR reference to packed field is unaligned + | ^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> tests/ui/pin_project/packed_sneaky-4.rs:8:1 + | +8 | #[pin_project] //~ ERROR reference to packed field is unaligned + | ^^^^^^^^^^^^^^ + = 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 + = note: fields of packed structs are not properly aligned, and 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 derive macro `::pin_project::__private::__PinProjectInternalDerive` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/pin_project/project_replace_unsized.stderr b/tests/ui/pin_project/project_replace_unsized.stderr index 86cc1488..042b4994 100644 --- a/tests/ui/pin_project/project_replace_unsized.stderr +++ b/tests/ui/pin_project/project_replace_unsized.stderr @@ -48,25 +48,25 @@ help: consider removing the `?Sized` bound to make the type parameter `Sized` | error[E0277]: the size for values of type `T` cannot be known at compilation time - --> tests/ui/pin_project/project_replace_unsized.rs:5:5 - | -3 | #[pin_project(project_replace)] //~ ERROR E0277 - | ------------------------------- required by a bound introduced by this call -4 | struct Struct { - | - this type parameter needs to be `std::marker::Sized` -5 | f: T, - | ^ doesn't have a size known at compile-time - | + --> tests/ui/pin_project/project_replace_unsized.rs:5:5 + | +3 | #[pin_project(project_replace)] //~ ERROR E0277 + | ------------------------------- required by a bound introduced by this call +4 | struct Struct { + | - this type parameter needs to be `std::marker::Sized` +5 | f: T, + | ^ doesn't have a size known at compile-time + | note: required by a bound in `std::ptr::read` - --> $RUST/core/src/ptr/mod.rs - | - | pub const unsafe fn read(src: *const T) -> T { - | ^ required by this bound in `std::ptr::read` + --> $RUST/core/src/ptr/mod.rs + | + | pub const unsafe fn read(src: *const T) -> T { + | ^ required by this bound in `std::ptr::read` help: consider removing the `?Sized` bound to make the type parameter `Sized` - | -4 - struct Struct { -4 + struct Struct { - | + | +4 - struct Struct { +4 + struct Struct { + | error[E0277]: the size for values of type `T` cannot be known at compilation time --> tests/ui/pin_project/project_replace_unsized.rs:8:15 diff --git a/tests/ui/pin_project/project_replace_unsized_fn_params.stderr b/tests/ui/pin_project/project_replace_unsized_fn_params.stderr index e398ca4e..10fad081 100644 --- a/tests/ui/pin_project/project_replace_unsized_fn_params.stderr +++ b/tests/ui/pin_project/project_replace_unsized_fn_params.stderr @@ -45,25 +45,25 @@ help: consider removing the `?Sized` bound to make the type parameter `Sized` | error[E0277]: the size for values of type `T` cannot be known at compilation time - --> tests/ui/pin_project/project_replace_unsized_fn_params.rs:7:5 - | -5 | #[pin_project(project_replace)] //~ ERROR E0277 - | ------------------------------- required by a bound introduced by this call -6 | struct Struct { - | - this type parameter needs to be `std::marker::Sized` -7 | f: T, - | ^ doesn't have a size known at compile-time - | + --> tests/ui/pin_project/project_replace_unsized_fn_params.rs:7:5 + | +5 | #[pin_project(project_replace)] //~ ERROR E0277 + | ------------------------------- required by a bound introduced by this call +6 | struct Struct { + | - this type parameter needs to be `std::marker::Sized` +7 | f: T, + | ^ doesn't have a size known at compile-time + | note: required by a bound in `std::ptr::read` - --> $RUST/core/src/ptr/mod.rs - | - | pub const unsafe fn read(src: *const T) -> T { - | ^ required by this bound in `std::ptr::read` + --> $RUST/core/src/ptr/mod.rs + | + | pub const unsafe fn read(src: *const T) -> T { + | ^ required by this bound in `std::ptr::read` help: consider removing the `?Sized` bound to make the type parameter `Sized` - | -6 - struct Struct { -6 + struct Struct { - | + | +6 - struct Struct { +6 + struct Struct { + | error[E0277]: the size for values of type `T` cannot be known at compilation time --> tests/ui/pin_project/project_replace_unsized_fn_params.rs:11:8 diff --git a/tests/ui/pin_project/unpin_sneaky.stderr b/tests/ui/pin_project/unpin_sneaky.stderr index ddf700de..82c2aa5b 100644 --- a/tests/ui/pin_project/unpin_sneaky.stderr +++ b/tests/ui/pin_project/unpin_sneaky.stderr @@ -3,9 +3,3 @@ error[E0412]: cannot find type `__S` in this scope | 9 | impl Unpin for __S {} //~ 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:9:1 - | -9 | impl Unpin for __S {} //~ ERROR E0412,E0321 - | ^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type diff --git a/tests/ui/pinned_drop/call-drop-inner.stderr b/tests/ui/pinned_drop/call-drop-inner.stderr index b11bee50..e3ceebd5 100644 --- a/tests/ui/pinned_drop/call-drop-inner.stderr +++ b/tests/ui/pinned_drop/call-drop-inner.stderr @@ -2,9 +2,7 @@ error[E0061]: this function takes 0 arguments but 1 argument was supplied --> tests/ui/pinned_drop/call-drop-inner.rs:13:9 | 13 | __drop_inner(__self); - | ^^^^^^^^^^^^ ------ supplied 1 argument - | | - | expected 0 arguments + | ^^^^^^^^^^^^ ------ argument of type `Pin<&mut Struct>` unexpected | note: function defined here --> tests/ui/pinned_drop/call-drop-inner.rs:10:1 @@ -12,3 +10,7 @@ note: function defined here 10 | #[pinned_drop] | ^^^^^^^^^^^^^^ = note: this error originates in the attribute macro `pinned_drop` (in Nightly builds, run with -Z macro-backtrace for more info) +help: remove the extra argument + | +13 | __drop_inner(); + | ~~~~~~~~~~~~~~ diff --git a/tests/ui/pinned_drop/conditional-drop-impl.stderr b/tests/ui/pinned_drop/conditional-drop-impl.stderr index 0c55bc2a..05877657 100644 --- a/tests/ui/pinned_drop/conditional-drop-impl.stderr +++ b/tests/ui/pinned_drop/conditional-drop-impl.stderr @@ -7,10 +7,8 @@ error[E0367]: `Drop` impl requires `T: Unpin` but the struct it is implemented f note: the implementor must specify the same requirement --> tests/ui/pinned_drop/conditional-drop-impl.rs:7:1 | -7 | / struct DropImpl { -8 | | f: T, -9 | | } - | |_^ +7 | struct DropImpl { + | ^^^^^^^^^^^^^^^^^^ error[E0277]: `T` cannot be unpinned --> tests/ui/pinned_drop/conditional-drop-impl.rs:16:15 diff --git a/tests/ui/unsafe_unpin/conflict-unpin.stderr b/tests/ui/unsafe_unpin/conflict-unpin.stderr index 20d4e088..0e89b03a 100644 --- a/tests/ui/unsafe_unpin/conflict-unpin.stderr +++ b/tests/ui/unsafe_unpin/conflict-unpin.stderr @@ -5,7 +5,7 @@ error[E0119]: conflicting implementations of trait `std::marker::Unpin` for type | ^^^^^^^^^^^ conflicting implementation for `Foo<_, _>` ... 10 | impl Unpin for Foo where T: Unpin {} - | --------------------------------------------- first implementation here + | ------------------------------ first implementation here | = note: upstream crates may add a new impl of trait `_::_pin_project::UnsafeUnpin` for type `_::_pin_project::__private::Wrapper<'_, Foo<_, _>>` in future versions diff --git a/tests/ui/unstable-features/negative_impls.rs b/tests/ui/unstable-features/negative_impls.rs new file mode 100644 index 00000000..96056423 --- /dev/null +++ b/tests/ui/unstable-features/negative_impls.rs @@ -0,0 +1,23 @@ +#![feature(negative_impls)] +#![deny(suspicious_auto_trait_impls)] + +// https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/design.20meeting.3A.20backlog.20bonanza/near/269471299 +// https://github.com/taiki-e/pin-project/issues/340 + +#[pin_project::pin_project] +struct Foo { + #[pin] + pinned: Pinned, + + unpinned: Unpinned, +} + +struct MyPhantomPinned {} +impl !Unpin for MyPhantomPinned {} +impl Unpin for Foo {} + +fn is_unpin() {} + +fn main() { + is_unpin::>() +} diff --git a/tests/ui/unstable-features/negative_impls.stderr b/tests/ui/unstable-features/negative_impls.stderr new file mode 100644 index 00000000..0d99e2bf --- /dev/null +++ b/tests/ui/unstable-features/negative_impls.stderr @@ -0,0 +1,19 @@ +error: cross-crate traits with a default impl, like `Unpin`, should not be specialized + --> tests/ui/unstable-features/negative_impls.rs:17:1 + | +17 | impl Unpin for Foo {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> tests/ui/unstable-features/negative_impls.rs:2:9 + | +2 | #![deny(suspicious_auto_trait_impls)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = warning: this will change its meaning in a future release! + = note: for more information, see issue #93367 + = note: `MyPhantomPinned` is not a generic parameter +note: try using the same sequence of generic parameters as the struct definition + --> tests/ui/unstable-features/negative_impls.rs:8:1 + | +8 | struct Foo { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tools/ci.sh b/tools/ci.sh index 9f58cc3f..abb5e170 100755 --- a/tools/ci.sh +++ b/tools/ci.sh @@ -7,7 +7,7 @@ IFS=$'\n\t' # USAGE: # ./tools/ci.sh [+toolchain] # -# NOTE: This script requires nightly Rust, rustfmt, clippy, and cargo-expand +# Note: This script requires nightly Rust, rustfmt, clippy, and cargo-expand bail() { echo >&2 "error: $*" diff --git a/tools/publish.sh b/tools/publish.sh index 142a5732..7acdf4a6 100755 --- a/tools/publish.sh +++ b/tools/publish.sh @@ -1,28 +1,87 @@ #!/bin/bash set -euo pipefail IFS=$'\n\t' +cd "$(dirname "$0")"/.. # Publish a new release. # # USAGE: -# ./tools/publish.sh +# ./tools/publish.sh # -# NOTE: -# - This script requires parse-changelog - -cd "$(cd "$(dirname "$0")" && pwd)"/.. +# Note: This script requires the following tools: +# - parse-changelog +# - cargo-workspaces +x() { + local cmd="$1" + shift + ( + set -x + "${cmd}" "$@" + ) +} bail() { echo >&2 "error: $*" exit 1 } -if [[ $# -gt 0 ]]; then - bail "invalid argument '$1'" +version="${1:?}" +version="${version#v}" +tag="v${version}" +if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then + bail "invalid version format '${version}'" fi +if [[ $# -gt 1 ]]; then + bail "invalid argument '$2'" +fi + +# Make sure there is no uncommitted change. +git diff --exit-code +git diff --exit-code --staged + +# Make sure the same release has not been created in the past. +if gh release view "${tag}" &>/dev/null; then + bail "tag '${tag}' has already been created and pushed" +fi + +if ! git branch | grep -q '\* main'; then + bail "current branch is not 'main'" +fi + +tags=$(git --no-pager tag) +if [[ -n "${tags}" ]]; then + # Make sure the same release does not exist in CHANGELOG.md. + release_date=$(date -u '+%Y-%m-%d') + if grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" CHANGELOG.md; then + bail "release ${version} already exist in CHANGELOG.md" + fi + if grep -Eq "^\\[${version//./\\.}\\]: " CHANGELOG.md; then + bail "link to ${version} already exist in CHANGELOG.md" + fi + + # Update changelog. + remote_url=$(grep -E '^\[Unreleased\]: https://' CHANGELOG.md | sed 's/^\[Unreleased\]: //' | sed 's/\.\.\.HEAD$//') + before_tag=$(sed <<<"${remote_url}" 's/^.*\/compare\///') + remote_url=$(sed <<<"${remote_url}" 's/\/compare\/v.*$//') + sed -i "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" CHANGELOG.md + sed -i "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/v${version}...HEAD\\n[${version}]: ${remote_url}/compare/${before_tag}...v${version}#" CHANGELOG.md + if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" CHANGELOG.md; then + bail "failed to update CHANGELOG.md" + fi + if ! grep -Eq "^\\[${version//./\\.}\\]: " CHANGELOG.md; then + bail "failed to update CHANGELOG.md" + fi +fi + +# Make sure that a valid release note for this version exists. +# https://github.com/taiki-e/parse-changelog +echo "============== CHANGELOG ==============" +parse-changelog CHANGELOG.md "${version}" +echo "=======================================" -# Make sure that the version number of publishable workspace members matches the specified version. metadata="$(cargo metadata --format-version=1 --all-features --no-deps)" +prev_version='' +manifest_paths=() for id in $(jq <<<"${metadata}" '.workspace_members[]'); do pkg="$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})")" publish=$(jq <<<"${pkg}" -r '.publish') @@ -31,36 +90,28 @@ for id in $(jq <<<"${metadata}" '.workspace_members[]'); do continue fi actual_version=$(jq <<<"${pkg}" -r '.version') - if [[ -z "${version:-}" ]]; then - version="${actual_version}" + if [[ -z "${prev_version:-}" ]]; then + prev_version="${actual_version}" fi - if [[ "${actual_version}" != "${version}" ]]; then + # Make sure that the version number of all publishable workspace members matches. + if [[ "${actual_version}" != "${prev_version}" ]]; then name=$(jq <<<"${pkg}" -r '.name') - bail "publishable workspace members must be version '${version}', but package '${name}' is version '${actual_version}'" + bail "publishable workspace members must be version '${prev_version}', but package '${name}' is version '${actual_version}'" fi -done -tag="v${version}" - -# Make sure there is no uncommitted change. -git diff --exit-code -git diff --exit-code --staged -# Make sure that a valid release note for this version exists. -# https://github.com/taiki-e/parse-changelog -echo "============== CHANGELOG ==============" -parse-changelog CHANGELOG.md "${version}" -echo "=======================================" + manifest_path=$(jq <<<"${pkg}" -r '.manifest_path') + manifest_paths+=("${manifest_path}") +done -if ! grep /dev/null; then - bail "not found link to [${version}] in CHANGELOG.md" -fi +# Update version. +x cargo workspaces version --force '*' --no-git-commit --exact -y custom "${version}" -# Make sure the same release has not been created in the past. -if gh release view "${tag}" &>/dev/null; then - bail "tag '${tag}' has already been created and pushed" +if [[ -n "${tags}" ]]; then + # Create a release commit. + x git add CHANGELOG.md "${manifest_paths[@]}" + x git commit -m "Release ${version}" fi -set -x - -git tag "${tag}" -git push origin --tags +x git tag "${tag}" +x git push origin main +x git push origin --tags diff --git a/tools/update-version.sh b/tools/update-version.sh deleted file mode 100755 index 6d5a8ada..00000000 --- a/tools/update-version.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -euo pipefail -IFS=$'\n\t' - -# Update version in Cargo.toml. -# -# USAGE: -# ./tools/update-version.sh [options] -# ./tools/update-version.sh patch -# ./tools/update-version.sh minor -# ./tools/update-version.sh prerelease --pre-id alpha -# -# NOTE: This script requires cargo-workspaces - -cargo workspaces version --force '*' --no-git-commit --exact -y "$@"