aboutsummaryrefslogtreecommitdiff
path: root/tests/proper_unpin.rs
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2020-10-26 16:54:29 -0700
committerChih-Hung Hsieh <chh@google.com>2020-10-26 16:57:40 -0700
commit127364b149c24623fd15786790a98af3b5355389 (patch)
tree55ba197683b0a0093a2767fcb1f576490157f8a1 /tests/proper_unpin.rs
parentc112e35face1579eba180108bda3da10b61d9926 (diff)
downloadpin-project-127364b149c24623fd15786790a98af3b5355389.tar.gz
Upgrade rust/crates/pin-project to 1.0.1
* Add missing patches, needed by external_updater Test: make Test: tools/external_updater/updater.sh update --refresh --keep_date rust/crates/pin-project Change-Id: I3738561830ce97903036460713eb3b74700b889e
Diffstat (limited to 'tests/proper_unpin.rs')
-rw-r--r--tests/proper_unpin.rs135
1 files changed, 135 insertions, 0 deletions
diff --git a/tests/proper_unpin.rs b/tests/proper_unpin.rs
new file mode 100644
index 0000000..ce2a6c8
--- /dev/null
+++ b/tests/proper_unpin.rs
@@ -0,0 +1,135 @@
+#![warn(rust_2018_idioms, single_use_lifetimes)]
+#![allow(dead_code)]
+
+#[macro_use]
+mod auxiliary;
+
+pub mod default {
+ use pin_project::pin_project;
+ use std::marker::PhantomPinned;
+
+ struct Inner<T> {
+ f: T,
+ }
+
+ assert_unpin!(Inner<()>);
+ assert_not_unpin!(Inner<PhantomPinned>);
+
+ #[pin_project]
+ struct Foo<T, U> {
+ #[pin]
+ f1: Inner<T>,
+ f2: U,
+ }
+
+ assert_unpin!(Foo<(), ()>);
+ assert_unpin!(Foo<(), PhantomPinned>);
+ assert_not_unpin!(Foo<PhantomPinned, ()>);
+ assert_not_unpin!(Foo<PhantomPinned, PhantomPinned>);
+
+ #[pin_project]
+ struct TrivialBounds {
+ #[pin]
+ f: PhantomPinned,
+ }
+
+ assert_not_unpin!(TrivialBounds);
+
+ #[pin_project]
+ struct Bar<'a, T, U> {
+ #[pin]
+ f1: &'a mut Inner<T>,
+ f2: U,
+ }
+
+ assert_unpin!(Bar<'_, PhantomPinned, PhantomPinned>);
+}
+
+pub mod cfg {
+ use pin_project::pin_project;
+ use std::marker::PhantomPinned;
+
+ #[pin_project]
+ struct Foo<T> {
+ #[cfg(any())]
+ #[pin]
+ f: T,
+ #[cfg(not(any()))]
+ f: T,
+ }
+
+ assert_unpin!(Foo<PhantomPinned>);
+
+ #[pin_project]
+ struct Bar<T> {
+ #[cfg(any())]
+ f: T,
+ #[cfg(not(any()))]
+ #[pin]
+ f: T,
+ }
+
+ assert_unpin!(Bar<()>);
+ assert_not_unpin!(Bar<PhantomPinned>);
+}
+
+pub mod cfg_attr {
+ use pin_project::pin_project;
+ use std::marker::PhantomPinned;
+
+ #[cfg_attr(any(), pin_project)]
+ struct Foo<T> {
+ f: T,
+ }
+
+ assert_unpin!(Foo<()>);
+ assert_not_unpin!(Foo<PhantomPinned>);
+
+ #[cfg_attr(not(any()), pin_project)]
+ struct Bar<T> {
+ #[cfg_attr(not(any()), pin)]
+ f: T,
+ }
+
+ assert_unpin!(Bar<()>);
+ assert_not_unpin!(Bar<PhantomPinned>);
+}
+
+// pin_project(!Unpin)
+pub mod not_unpin {
+ use pin_project::pin_project;
+ use std::marker::PhantomPinned;
+
+ struct Inner<T> {
+ f: T,
+ }
+
+ #[pin_project(!Unpin)]
+ struct Foo<T, U> {
+ #[pin]
+ inner: Inner<T>,
+ other: U,
+ }
+
+ assert_not_unpin!(Foo<(), ()>);
+ assert_not_unpin!(Foo<(), PhantomPinned>);
+ assert_not_unpin!(Foo<PhantomPinned, ()>);
+ assert_not_unpin!(Foo<PhantomPinned, PhantomPinned>);
+
+ #[pin_project(!Unpin)]
+ struct TrivialBounds {
+ #[pin]
+ f: PhantomPinned,
+ }
+
+ assert_not_unpin!(TrivialBounds);
+
+ #[pin_project(!Unpin)]
+ struct Bar<'a, T, U> {
+ #[pin]
+ inner: &'a mut Inner<T>,
+ other: U,
+ }
+
+ assert_not_unpin!(Bar<'_, (), ()>);
+}