diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fa3c5b..ee34b64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This project adheres to [Semantic Versioning](https://semver.org). ## [Unreleased] +* Fix trailing comma support in generics + ## [0.1.8] - 2020-09-26 * Fix compatibility of generated code with `forbid(future_incompatible)` diff --git a/src/lib.rs b/src/lib.rs index 31622ca..74be4e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -208,6 +208,7 @@ macro_rules! __pin_project_internal { ),+ } + #[allow(explicit_outlives_requirements)] #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058 #[allow(clippy::used_underscore_binding)] const _: () = { @@ -460,7 +461,8 @@ macro_rules! __pin_project_internal { ( $(#[$attrs:meta])* pub struct $ident:ident $(< - $( $generics:tt + $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? + $( $generics:ident $(: $generics_bound:path)? $(: ?$generics_unsized_bound:path)? $(: $generics_lifetime_bound:lifetime)? @@ -484,18 +486,24 @@ macro_rules! __pin_project_internal { $crate::__pin_project_internal! { @struct_internal; [pub(crate)] [$(#[$attrs])* pub struct $ident] - [$(< $( $generics - $(: $generics_bound)? - $(: ?$generics_unsized_bound)? - $(: $generics_lifetime_bound)? - $(= $generics_default)? - ),* >)?] - [$( $( $generics - $(: $generics_bound)? - $(: ?$generics_unsized_bound)? - $(: $generics_lifetime_bound)? - ),* )?] - [$( $( $generics ),* )?] + [$(< + $( $lifetime $(: $lifetime_bound)? ,)* + $( $generics + $(: $generics_bound)? + $(: ?$generics_unsized_bound)? + $(: $generics_lifetime_bound)? + $(= $generics_default)? + ),* + >)?] + [$( + $( $lifetime $(: $lifetime_bound)? ,)* + $( $generics + $(: $generics_bound)? + $(: ?$generics_unsized_bound)? + $(: $generics_lifetime_bound)? + ),* + )?] + [$( $( $lifetime ,)* $( $generics ),* )?] [$(where $( $where_clause_ty $(: $where_clause_bound)? $(: ?$where_clause_unsized_bound)? @@ -512,7 +520,8 @@ macro_rules! __pin_project_internal { ( $(#[$attrs:meta])* $vis:vis struct $ident:ident $(< - $( $generics:tt + $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? + $( $generics:ident $(: $generics_bound:path)? $(: ?$generics_unsized_bound:path)? $(: $generics_lifetime_bound:lifetime)? @@ -536,18 +545,24 @@ macro_rules! __pin_project_internal { $crate::__pin_project_internal! { @struct_internal; [$vis] [$(#[$attrs])* $vis struct $ident] - [$(< $( $generics - $(: $generics_bound)? - $(: ?$generics_unsized_bound)? - $(: $generics_lifetime_bound)? - $(= $generics_default)? - ),* >)?] - [$( $( $generics - $(: $generics_bound)? - $(: ?$generics_unsized_bound)? - $(: $generics_lifetime_bound)? - ),* )?] - [$( $( $generics ),* )?] + [$(< + $( $lifetime $(: $lifetime_bound)? ,)* + $( $generics + $(: $generics_bound)? + $(: ?$generics_unsized_bound)? + $(: $generics_lifetime_bound)? + $(= $generics_default)? + ),* + >)?] + [$( + $( $lifetime $(: $lifetime_bound)? ,)* + $( $generics + $(: $generics_bound)? + $(: ?$generics_unsized_bound)? + $(: $generics_lifetime_bound)? + ),* + )?] + [$( $( $lifetime ,)* $( $generics ),* )?] [$(where $( $where_clause_ty $(: $where_clause_bound)? $(: ?$where_clause_unsized_bound)? diff --git a/tests/expand/tests/expand/default-struct.expanded.rs b/tests/expand/tests/expand/default-struct.expanded.rs index 04e9c36..460a105 100644 --- a/tests/expand/tests/expand/default-struct.expanded.rs +++ b/tests/expand/tests/expand/default-struct.expanded.rs @@ -3,6 +3,7 @@ struct Struct { pinned: T, unpinned: U, } +#[allow(explicit_outlives_requirements)] #[allow(single_use_lifetimes)] #[allow(clippy::used_underscore_binding)] const _: () = { diff --git a/tests/expand/tests/expand/pub-struct.expanded.rs b/tests/expand/tests/expand/pub-struct.expanded.rs index 6eaabdc..1f8b2dd 100644 --- a/tests/expand/tests/expand/pub-struct.expanded.rs +++ b/tests/expand/tests/expand/pub-struct.expanded.rs @@ -3,6 +3,7 @@ pub struct Struct { pub pinned: T, pub unpinned: U, } +#[allow(explicit_outlives_requirements)] #[allow(single_use_lifetimes)] #[allow(clippy::used_underscore_binding)] const _: () = { diff --git a/tests/test.rs b/tests/test.rs index afbef0b..60f215b 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -385,3 +385,51 @@ fn no_infer_outlives() { } } } + +// https://github.com/taiki-e/pin-project-lite/issues/31 +#[test] +fn trailing_comma() { + pub trait T {} + + pin_project! { + pub struct S1< + A: T, + B: T, + > { + f: (A, B), + } + } + + pin_project! { + pub struct S2< + A, + B, + > + where + A: T, + B: T, + { + f: (A, B), + } + } + + pin_project! { + #[allow(explicit_outlives_requirements)] + pub struct S3< + 'a, + A: 'a, + B: 'a, + > { + f: &'a (A, B), + } + } + + // pin_project! { + // pub struct S4< + // 'a, + // 'b: 'a, // <----- + // > { + // f: &'a &'b (), + // } + // } +}