Auto merge of #133828 - compiler-errors:incr-sad, r= · rust-lang/rust@780efa9 (original) (raw)
File tree
5 files changed
lines changed
- rustc_trait_selection/src/traits/select
- rustc_type_ir/src/search_graph
5 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -302,7 +302,11 @@ impl<D: Deps> DepGraph { | ||
302 | 302 | OP: FnOnce() -> R, |
303 | 303 | { |
304 | 304 | match self.data() { |
305 | -Some(data) => data.with_anon_task(cx, dep_kind, op), | |
305 | +Some(data) => { | |
306 | +let (result, index) = data.with_anon_task_inner(cx, dep_kind, op); | |
307 | +self.read_index(index); | |
308 | +(result, index) | |
309 | +} | |
306 | 310 | None => (op(), self.next_virtual_depnode_index()), |
307 | 311 | } |
308 | 312 | } |
@@ -397,7 +401,7 @@ impl<D: Deps> DepGraphData { | ||
397 | 401 | |
398 | 402 | /// Executes something within an "anonymous" task, that is, a task the |
399 | 403 | /// `DepNode` of which is determined by the list of inputs it read from. |
400 | - pub(crate) fn with_anon_task<Tcx: DepContext<Deps = D>, OP, R>( | |
404 | + pub(crate) fn with_anon_task_inner<Tcx: DepContext<Deps = D>, OP, R>( | |
401 | 405 | &self, |
402 | 406 | cx: Tcx, |
403 | 407 | dep_kind: DepKind, |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -520,9 +520,11 @@ where | ||
520 | 520 | let (result, dep_node_index) = |
521 | 521 | qcx.start_query(job_id, query.depth_limit(), Some(&diagnostics), | |
522 | 522 | if query.anon() { |
523 | -return dep_graph_data.with_anon_task(*qcx.dep_context(), query.dep_kind(), | | |
524 | - query.compute(qcx, key) | |
525 | -}); | |
523 | +return dep_graph_data.with_anon_task_inner( | |
524 | +*qcx.dep_context(), | |
525 | + query.dep_kind(), | |
526 | + | | |
527 | +); | |
526 | 528 | } |
527 | 529 | |
528 | 530 | // `to_dep_node` is expensive for some `DepKind`s. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1400,10 +1400,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { | ||
1400 | 1400 | where |
1401 | 1401 | OP: FnOnce(&mut Self) -> R, |
1402 | 1402 | { |
1403 | -let (result, dep_node) = | |
1404 | -self.tcx().dep_graph.with_anon_task(self.tcx(), dep_kinds::TraitSelect, | | |
1405 | -self.tcx().dep_graph.read_index(dep_node); | |
1406 | -(result, dep_node) | |
1403 | +self.tcx().dep_graph.with_anon_task(self.tcx(), dep_kinds::TraitSelect, | | |
1407 | 1404 | } |
1408 | 1405 | |
1409 | 1406 | /// filter_impls filters candidates that have a positive impl for a negative |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -511,7 +511,7 @@ impl<D: Delegate<Cx = X>, X: Cx> SearchGraph { | ||
511 | 511 | |
512 | 512 | // This is for global caching, so we properly track query dependencies. |
513 | 513 | // Everything that affects the `result` should be performed within this |
514 | -// `with_anon_task` closure. If computing this goal depends on something | |
514 | +// `with_cached_task` closure. If computing this goal depends on something | |
515 | 515 | // not tracked by the cache key and from outside of this anon task, it |
516 | 516 | // must not be added to the global cache. Notably, this is the case for |
517 | 517 | // trait solver cycles participants. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
1 | +//@ revisions: cfail1 cfail2 | |
2 | + | |
3 | +//@ compile-flags: -Znext-solver | |
4 | +//@ check-pass | |
5 | + | |
6 | +pub trait Future { | |
7 | +type Error; | |
8 | +fn poll() -> Self::Error; | |
9 | +} | |
10 | + | |
11 | +struct S; | |
12 | +impl Future for S { | |
13 | +type Error = Error; | |
14 | +fn poll() -> Self::Error { | |
15 | +todo!() | |
16 | +} | |
17 | +} | |
18 | + | |
19 | +#[cfg(cfail1)] | |
20 | +pub struct Error(()); | |
21 | + | |
22 | +#[cfg(cfail2)] | |
23 | +pub struct Error(); | |
24 | + | |
25 | +fn main() {} |