Skip to content

Commit 62b4921

Browse files
committed
Fix handling of arguments of #[pin_project] attribute
1 parent 403d0da commit 62b4921

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

pin-project-internal/src/pin_project/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ impl Parse for Args {
3737
"UnsafeUnpin" => unsafe_unpin = Some(i.span()),
3838
_ => return Err(error!(i, "an invalid argument was passed")),
3939
}
40+
41+
if !input.is_empty() {
42+
let _: Comma = input.parse()?;
43+
}
4044
}
4145
Ok(Self { pinned_drop, unsafe_unpin })
4246
}

tests/pin_project.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#![allow(dead_code)]
55

66
use core::pin::Pin;
7-
use pin_project::pin_project;
7+
use pin_project::{pin_project, pinned_drop, UnsafeUnpin};
88

99
#[test]
1010
fn test_pin_project() {
@@ -164,3 +164,19 @@ fn overlapping_lifetime_names() {
164164
field: &'_pin mut T,
165165
}
166166
}
167+
168+
#[test]
169+
fn combine() {
170+
#[pin_project(PinnedDrop, UnsafeUnpin)]
171+
pub struct Foo<T> {
172+
field_1: u8,
173+
#[pin]
174+
field_2: T,
175+
}
176+
177+
#[pinned_drop]
178+
fn do_drop<T>(_: Pin<&mut Foo<T>>) {}
179+
180+
#[allow(unsafe_code)]
181+
unsafe impl<T: Unpin> UnsafeUnpin for Foo<T> {}
182+
}

tests/ui/pin_project/invalid.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,10 @@ enum D<T> {
2626
},
2727
}
2828

29+
#[pin_project(UnsafeUnpin,,)] //~ ERROR unexpected token
30+
struct E<T> {
31+
#[pin]
32+
future: T,
33+
}
34+
2935
fn main() {}

tests/ui/pin_project/invalid.stderr

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,11 @@ error: unexpected token
2222
24 | #[pin(foo)] //~ ERROR unexpected token
2323
| ^
2424

25-
error: aborting due to 4 previous errors
25+
error: expected identifier
26+
--> $DIR/invalid.rs:29:27
27+
|
28+
29 | #[pin_project(UnsafeUnpin,,)] //~ ERROR unexpected token
29+
| ^
30+
31+
error: aborting due to 5 previous errors
2632

0 commit comments

Comments
 (0)