Skip to content

Commit

Permalink
Rollup merge of #108901 - LYF1999:yf/108897, r=lcnr
Browse files Browse the repository at this point in the history
fix: evaluate with wrong obligation stack

fix #108897
r? `@lcnr`
  • Loading branch information
GuillaumeGomez authored Mar 8, 2023
2 parents ec7485c + 204ba32 commit 4b60218
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
4 changes: 2 additions & 2 deletions compiler/rustc_trait_selection/src/traits/select/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
let mut nested_result = EvaluationResult::EvaluatedToOk;
for obligation in nested_obligations {
nested_result = cmp::max(
this.evaluate_predicate_recursively(stack.list(), obligation)?,
this.evaluate_predicate_recursively(previous_stack, obligation)?,
nested_result,
);
}
Expand All @@ -1092,7 +1092,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
let obligation = obligation.with(this.tcx(), predicate);
result = cmp::max(
nested_result,
this.evaluate_trait_predicate_recursively(stack.list(), obligation)?,
this.evaluate_trait_predicate_recursively(previous_stack, obligation)?,
);
}
}
Expand Down
21 changes: 21 additions & 0 deletions tests/ui/traits/unsend-future.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// edition:2021

// issue 108897
trait Handler {}
impl<F, Fut> Handler for F
where
Fut: Send,
F: FnOnce() -> Fut,
{}

fn require_handler<H: Handler>(h: H) {}

async fn handler() {
let a = &1 as *const i32;
async {}.await;
}

fn main() {
require_handler(handler)
//~^ ERROR future cannot be sent between threads safely
}
24 changes: 24 additions & 0 deletions tests/ui/traits/unsend-future.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
error: future cannot be sent between threads safely
--> $DIR/unsend-future.rs:19:21
|
LL | require_handler(handler)
| ^^^^^^^ future returned by `handler` is not `Send`
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `*const i32`
note: future is not `Send` as this value is used across an await
--> $DIR/unsend-future.rs:15:13
|
LL | let a = &1 as *const i32;
| - has type `*const i32` which is not `Send`
LL | async {}.await;
| ^^^^^^ await occurs here, with `a` maybe used later
LL | }
| - `a` is later dropped here
note: required by a bound in `require_handler`
--> $DIR/unsend-future.rs:11:23
|
LL | fn require_handler<H: Handler>(h: H) {}
| ^^^^^^^ required by this bound in `require_handler`

error: aborting due to previous error

0 comments on commit 4b60218

Please sign in to comment.