Rollup merge of #108901 - LYF1999:yf/108897, r=lcnr

fix: evaluate with wrong obligation stack

fix #108897
r? ``@lcnr``
This commit is contained in:
Matthias Krüger 2023-03-08 21:24:53 +01:00 committed by GitHub
commit 33c3036826
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 2 deletions

View File

@ -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,
);
}
@ -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)?,
);
}
}

View File

@ -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
}

View File

@ -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