Auto merge of #108820 - cjgillot:ensure-on-disk, r=oli-obk
Ensure value is on the on-disk cache before returning from `ensure()`. The current logic for `ensure()` a query just checks that the node is green in the dependency graph. However, a lot of places use `ensure()` to prevent the query from being called later. This is the case before stealing a query result. If the query is actually green but the value is not available in the on-disk cache, `ensure` would return, but a subsequent call to the full query would run the code, and attempt to read from a stolen value. This PR conforms the query system to the usage by checking whether the queried value is loadable from disk before returning. Sadly, I can't manage to craft a proper test... Should fix all instances of "attempted to read from stolen value".
This commit is contained in:
commit
f41927f309
10 changed files with 116 additions and 30 deletions
|
@ -2050,13 +2050,13 @@ fn prefetch_mir(tcx: TyCtxt<'_>) {
|
|||
let (encode_const, encode_opt) = should_encode_mir(tcx, def_id);
|
||||
|
||||
if encode_const {
|
||||
tcx.ensure().mir_for_ctfe(def_id);
|
||||
tcx.ensure_with_value().mir_for_ctfe(def_id);
|
||||
}
|
||||
if encode_opt {
|
||||
tcx.ensure().optimized_mir(def_id);
|
||||
tcx.ensure_with_value().optimized_mir(def_id);
|
||||
}
|
||||
if encode_opt || encode_const {
|
||||
tcx.ensure().promoted_mir(def_id);
|
||||
tcx.ensure_with_value().promoted_mir(def_id);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue