Skip to content

Commit

Permalink
Assemble Unpin candidates specially for generators in new solver
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Apr 14, 2023
1 parent a41fc00 commit b335c2d
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 5 deletions.
19 changes: 18 additions & 1 deletion compiler/rustc_trait_selection/src/solve/trait_goals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -168,6 +168,23 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {

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.
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/generator/non-static-is-unpin.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// revisions: current next
//[next] compile-flags: -Ztrait-solver=next
// run-pass

#![feature(generators, generator_trait)]
Expand Down
Original file line number Diff line number Diff line change
@@ -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`
Expand Down
19 changes: 19 additions & 0 deletions tests/ui/generator/static-not-unpin.next.stderr
Original file line number Diff line number Diff line change
@@ -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`.
3 changes: 3 additions & 0 deletions tests/ui/generator/static-not-unpin.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// revisions: current next
//[next] compile-flags: -Ztrait-solver=next

#![feature(generators)]

// normalize-stderr-test "std::pin::Unpin" -> "std::marker::Unpin"
Expand Down

0 comments on commit b335c2d

Please sign in to comment.