]> git.lizzy.rs Git - rust.git/commitdiff
Mark static generators as !Unpin
authorWim Looman <wim@nemo157.com>
Sun, 4 Nov 2018 21:07:55 +0000 (22:07 +0100)
committerWim Looman <wim@nemo157.com>
Sun, 27 Jan 2019 21:58:59 +0000 (22:58 +0100)
src/libcore/marker.rs
src/librustc/middle/lang_items.rs
src/librustc/traits/select.rs
src/test/ui/generator/static-not-unpin.rs [new file with mode: 0644]
src/test/ui/generator/static-not-unpin.stderr [new file with mode: 0644]

index 65752ba032104133d17b6d251dbb730b375ac876..457d556e4fa6d2db6fbc33233ded1bbe5a3c838d 100644 (file)
@@ -627,6 +627,7 @@ unsafe impl<T: ?Sized> Freeze for &mut T {}
 /// [`Pin`]: ../pin/struct.Pin.html
 /// [`pin module`]: ../../std/pin/index.html
 #[stable(feature = "pin", since = "1.33.0")]
+#[cfg_attr(not(stage0), lang = "unpin")]
 pub auto trait Unpin {}
 
 /// A marker type which does not implement `Unpin`.
index c203ea96f3d648f0ea418fd290099f65d500418f..e324bde1f17bfb38f4d021774cec5d788f6e5f38 100644 (file)
@@ -299,6 +299,7 @@ pub fn collect<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> LanguageItems {
 
     GeneratorStateLangItem,      "generator_state",    gen_state,               Target::Enum;
     GeneratorTraitLangItem,      "generator",          gen_trait,               Target::Trait;
+    UnpinTraitLangItem,          "unpin",              unpin_trait,             Target::Trait;
 
     EqTraitLangItem,             "eq",                 eq_trait,                Target::Trait;
     PartialOrdTraitLangItem,     "partial_ord",        partial_ord_trait,       Target::Trait;
index 9a0610f45dec2053ebe81d1b8c44a998c1fdb553..7a244b7e80e6afc9f9655a880c346b2fdca0bf33 100644 (file)
@@ -2017,6 +2017,12 @@ fn assemble_candidates_from_auto_impls(
                     // the auto impl might apply, we don't know
                     candidates.ambiguous = true;
                 }
+                ty::Generator(_, _, hir::GeneratorMovability::Static)
+                    if self.tcx().lang_items().unpin_trait() == Some(def_id) =>
+                {
+                    // Immovable generators are never `Unpin`, so suppress the
+                    // normal auto-impl candidate for it.
+                }
                 _ => candidates.vec.push(AutoImplCandidate(def_id.clone())),
             }
         }
diff --git a/src/test/ui/generator/static-not-unpin.rs b/src/test/ui/generator/static-not-unpin.rs
new file mode 100644 (file)
index 0000000..7586faf
--- /dev/null
@@ -0,0 +1,13 @@
+#![feature(generators)]
+
+use std::marker::Unpin;
+
+fn assert_unpin<T: Unpin>(_: T) {
+}
+
+fn main() {
+    let mut generator = static || {
+        yield;
+    };
+    assert_unpin(generator); //~ ERROR std::marker::Unpin` is not satisfied
+}
diff --git a/src/test/ui/generator/static-not-unpin.stderr b/src/test/ui/generator/static-not-unpin.stderr
new file mode 100644 (file)
index 0000000..7a1243f
--- /dev/null
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `[static generator@$DIR/static-not-unpin.rs:9:25: 11:6 _]: std::marker::Unpin` is not satisfied
+  --> $DIR/static-not-unpin.rs:12:5
+   |
+LL |     assert_unpin(generator); //~ ERROR std::marker::Unpin` is not satisfied
+   |     ^^^^^^^^^^^^ the trait `std::marker::Unpin` is not implemented for `[static generator@$DIR/static-not-unpin.rs:9:25: 11:6 _]`
+   |
+note: required by `assert_unpin`
+  --> $DIR/static-not-unpin.rs:5:1
+   |
+LL | fn assert_unpin<T: Unpin>(_: T) {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.