Assemble Unpin candidates specially for generators in new solver
This commit is contained in:
parent
a41fc00eaf
commit
b335c2d49f
5 changed files with 46 additions and 5 deletions
|
@ -3,7 +3,7 @@
|
||||||
use super::assembly::{self, structural_traits};
|
use super::assembly::{self, structural_traits};
|
||||||
use super::{EvalCtxt, SolverMode};
|
use super::{EvalCtxt, SolverMode};
|
||||||
use rustc_hir::def_id::DefId;
|
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::query::NoSolution;
|
||||||
use rustc_infer::traits::util::supertraits;
|
use rustc_infer::traits::util::supertraits;
|
||||||
use rustc_middle::traits::solve::{CanonicalResponse, Certainty, Goal, QueryResult};
|
use rustc_middle::traits::solve::{CanonicalResponse, Certainty, Goal, QueryResult};
|
||||||
|
@ -168,6 +168,23 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
||||||
|
|
||||||
ty::Infer(_) | ty::Bound(_, _) => bug!("unexpected type `{self_ty}`"),
|
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
|
// For rigid types, we only register a builtin auto implementation
|
||||||
// if there is no implementation that could ever apply to the self
|
// if there is no implementation that could ever apply to the self
|
||||||
// type.
|
// type.
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
// revisions: current next
|
||||||
|
//[next] compile-flags: -Ztrait-solver=next
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
#![feature(generators, generator_trait)]
|
#![feature(generators, generator_trait)]
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
error[E0277]: `[static generator@$DIR/static-not-unpin.rs:11:25: 11:34]` cannot be unpinned
|
error[E0277]: `[static generator@$DIR/static-not-unpin.rs:14:25: 14:34]` cannot be unpinned
|
||||||
--> $DIR/static-not-unpin.rs:14:18
|
--> $DIR/static-not-unpin.rs:17:18
|
||||||
|
|
|
|
||||||
LL | assert_unpin(generator);
|
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
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= note: consider using the `pin!` macro
|
= note: consider using the `pin!` macro
|
||||||
consider using `Box::pin` if you need to access the pinned value outside of the current scope
|
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`
|
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) {
|
LL | fn assert_unpin<T: Unpin>(_: T) {
|
||||||
| ^^^^^ required by this bound in `assert_unpin`
|
| ^^^^^ 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)]
|
#![feature(generators)]
|
||||||
|
|
||||||
// normalize-stderr-test "std::pin::Unpin" -> "std::marker::Unpin"
|
// normalize-stderr-test "std::pin::Unpin" -> "std::marker::Unpin"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue