Assemble Unpin candidates specially for generators in new solver
This commit is contained in:
parent
a41fc00eaf
commit
b335c2d49f
@ -3,7 +3,7 @@
|
||||
use super::assembly::{self, structural_traits};
|
||||
use super::{EvalCtxt, SolverMode};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::LangItem;
|
||||
use rustc_hir::{LangItem, Movability};
|
||||
use rustc_infer::traits::query::NoSolution;
|
||||
use rustc_infer::traits::util::supertraits;
|
||||
use rustc_middle::traits::solve::{CanonicalResponse, Certainty, Goal, QueryResult};
|
||||
@ -168,6 +168,23 @@ fn consider_auto_trait_candidate(
|
||||
|
||||
ty::Infer(_) | ty::Bound(_, _) => bug!("unexpected type `{self_ty}`"),
|
||||
|
||||
// Generators have one special built-in candidate, `Unpin`, which
|
||||
// takes precedence over the structural auto trait candidate being
|
||||
// assembled.
|
||||
ty::Generator(_, _, movability)
|
||||
if Some(goal.predicate.def_id()) == ecx.tcx().lang_items().unpin_trait() =>
|
||||
{
|
||||
match movability {
|
||||
Movability::Static => {
|
||||
return Err(NoSolution);
|
||||
}
|
||||
Movability::Movable => {
|
||||
return ecx
|
||||
.evaluate_added_goals_and_make_canonical_response(Certainty::Yes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For rigid types, we only register a builtin auto implementation
|
||||
// if there is no implementation that could ever apply to the self
|
||||
// type.
|
||||
|
@ -1,3 +1,5 @@
|
||||
// revisions: current next
|
||||
//[next] compile-flags: -Ztrait-solver=next
|
||||
// run-pass
|
||||
|
||||
#![feature(generators, generator_trait)]
|
||||
|
@ -1,15 +1,15 @@
|
||||
error[E0277]: `[static generator@$DIR/static-not-unpin.rs:11:25: 11:34]` cannot be unpinned
|
||||
--> $DIR/static-not-unpin.rs:14:18
|
||||
error[E0277]: `[static generator@$DIR/static-not-unpin.rs:14:25: 14:34]` cannot be unpinned
|
||||
--> $DIR/static-not-unpin.rs:17:18
|
||||
|
|
||||
LL | assert_unpin(generator);
|
||||
| ------------ ^^^^^^^^^ the trait `Unpin` is not implemented for `[static generator@$DIR/static-not-unpin.rs:11:25: 11:34]`
|
||||
| ------------ ^^^^^^^^^ the trait `Unpin` is not implemented for `[static generator@$DIR/static-not-unpin.rs:14:25: 14:34]`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: consider using the `pin!` macro
|
||||
consider using `Box::pin` if you need to access the pinned value outside of the current scope
|
||||
note: required by a bound in `assert_unpin`
|
||||
--> $DIR/static-not-unpin.rs:7:20
|
||||
--> $DIR/static-not-unpin.rs:10:20
|
||||
|
|
||||
LL | fn assert_unpin<T: Unpin>(_: T) {
|
||||
| ^^^^^ required by this bound in `assert_unpin`
|
19
tests/ui/generator/static-not-unpin.next.stderr
Normal file
19
tests/ui/generator/static-not-unpin.next.stderr
Normal file
@ -0,0 +1,19 @@
|
||||
error[E0277]: `[static generator@$DIR/static-not-unpin.rs:14:25: 14:34]` cannot be unpinned
|
||||
--> $DIR/static-not-unpin.rs:17:18
|
||||
|
|
||||
LL | assert_unpin(generator);
|
||||
| ------------ ^^^^^^^^^ the trait `Unpin` is not implemented for `[static generator@$DIR/static-not-unpin.rs:14:25: 14:34]`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: consider using the `pin!` macro
|
||||
consider using `Box::pin` if you need to access the pinned value outside of the current scope
|
||||
note: required by a bound in `assert_unpin`
|
||||
--> $DIR/static-not-unpin.rs:10:20
|
||||
|
|
||||
LL | fn assert_unpin<T: Unpin>(_: T) {
|
||||
| ^^^^^ required by this bound in `assert_unpin`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
@ -1,3 +1,6 @@
|
||||
// revisions: current next
|
||||
//[next] compile-flags: -Ztrait-solver=next
|
||||
|
||||
#![feature(generators)]
|
||||
|
||||
// normalize-stderr-test "std::pin::Unpin" -> "std::marker::Unpin"
|
||||
|
Loading…
Reference in New Issue
Block a user