mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-10 14:57:14 +00:00
Rollup merge of #47696 - Zoxc:variance-rg, r=nikomatsakis
Make use of the implemented red/green algorithm for variance r? @michaelwoerister
This commit is contained in:
commit
024e3aaff7
@ -14,16 +14,12 @@
|
||||
//! We walk the set of items and, for each member, generate new constraints.
|
||||
|
||||
use hir::def_id::DefId;
|
||||
use rustc::dep_graph::{DepGraphSafe, DepKind, DepNodeColor};
|
||||
use rustc::ich::StableHashingContext;
|
||||
use rustc::ty::subst::Substs;
|
||||
use rustc::ty::{self, Ty, TyCtxt};
|
||||
use syntax::ast;
|
||||
use rustc::hir;
|
||||
use rustc::hir::itemlikevisit::ItemLikeVisitor;
|
||||
|
||||
use rustc_data_structures::stable_hasher::StableHashingContextProvider;
|
||||
|
||||
use super::terms::*;
|
||||
use super::terms::VarianceTerm::*;
|
||||
|
||||
@ -132,50 +128,11 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for ConstraintContext<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> StableHashingContextProvider for ConstraintContext<'a, 'tcx> {
|
||||
type ContextType = StableHashingContext<'tcx>;
|
||||
|
||||
fn create_stable_hashing_context(&self) -> Self::ContextType {
|
||||
self.terms_cx.tcx.create_stable_hashing_context()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> DepGraphSafe for ConstraintContext<'a, 'tcx> {}
|
||||
|
||||
impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
||||
fn visit_node_helper(&mut self, id: ast::NodeId) {
|
||||
let tcx = self.terms_cx.tcx;
|
||||
let def_id = tcx.hir.local_def_id(id);
|
||||
|
||||
// Encapsulate constructing the constraints into a task we can
|
||||
// reference later. This can go away once the red-green
|
||||
// algorithm is in place.
|
||||
//
|
||||
// See README.md for a detailed discussion
|
||||
// on dep-graph management.
|
||||
let dep_node = def_id.to_dep_node(tcx, DepKind::ItemVarianceConstraints);
|
||||
|
||||
if let Some(DepNodeColor::Green(_)) = tcx.dep_graph.node_color(&dep_node) {
|
||||
// If the corresponding node has already been marked as green, the
|
||||
// appropriate portion of the DepGraph has already been loaded from
|
||||
// the previous graph, so we don't do any dep-tracking. Since we
|
||||
// don't cache any values though, we still have to re-run the
|
||||
// computation.
|
||||
tcx.dep_graph.with_ignore(|| {
|
||||
self.build_constraints_for_item(def_id);
|
||||
});
|
||||
} else {
|
||||
tcx.dep_graph.with_task(dep_node,
|
||||
self,
|
||||
def_id,
|
||||
visit_item_task);
|
||||
}
|
||||
|
||||
fn visit_item_task<'a, 'tcx>(ccx: &mut ConstraintContext<'a, 'tcx>,
|
||||
def_id: DefId)
|
||||
{
|
||||
ccx.build_constraints_for_item(def_id);
|
||||
}
|
||||
self.build_constraints_for_item(def_id);
|
||||
}
|
||||
|
||||
fn tcx(&self) -> TyCtxt<'a, 'tcx, 'tcx> {
|
||||
|
@ -12,7 +12,6 @@
|
||||
//! parameters. See README.md for details.
|
||||
|
||||
use arena;
|
||||
use rustc::dep_graph::DepKind;
|
||||
use rustc::hir;
|
||||
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
||||
use rustc::ty::{self, CrateVariancesMap, TyCtxt};
|
||||
@ -95,9 +94,6 @@ fn variances_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, item_def_id: DefId)
|
||||
// Everything else must be inferred.
|
||||
|
||||
let crate_map = tcx.crate_variances(LOCAL_CRATE);
|
||||
let dep_node = item_def_id.to_dep_node(tcx, DepKind::ItemVarianceConstraints);
|
||||
tcx.dep_graph.read(dep_node);
|
||||
|
||||
crate_map.variances.get(&item_def_id)
|
||||
.unwrap_or(&crate_map.empty_variance)
|
||||
.clone()
|
||||
|
@ -23,7 +23,7 @@ struct Foo<T> {
|
||||
f: T
|
||||
}
|
||||
|
||||
#[rustc_if_this_changed]
|
||||
#[rustc_if_this_changed(Krate)]
|
||||
type TypeAlias<T> = Foo<T>;
|
||||
|
||||
#[rustc_then_this_would_need(ItemVariances)] //~ ERROR OK
|
||||
|
Loading…
Reference in New Issue
Block a user