polymorphize: remove predicate logic
This commit removes all logic which marks parameters as used based on their presence in predicates - given rust-lang/rust#75675, this will enable more polymorphization and avoid the symbol clashes that predicate logic previously sidestepped. Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
50433a0bf4
commit
da2b69b614
3 changed files with 43 additions and 42 deletions
|
@ -89,9 +89,6 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
|
|||
};
|
||||
let mut vis = MarkUsedGenericParams { tcx, def_id, unused_parameters: &mut unused_parameters };
|
||||
vis.visit_body(body);
|
||||
debug!(?unused_parameters, "(after visitor)");
|
||||
|
||||
mark_used_by_predicates(tcx, def_id, &mut unused_parameters);
|
||||
debug!(?unused_parameters, "(end)");
|
||||
|
||||
// Emit errors for debugging and testing if enabled.
|
||||
|
@ -161,44 +158,6 @@ fn mark_used_by_default_parameters<'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
/// Search the predicates on used generic parameters for any unused generic parameters, and mark
|
||||
/// those as used.
|
||||
#[instrument(level = "debug", skip(tcx, def_id))]
|
||||
fn mark_used_by_predicates<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: DefId,
|
||||
unused_parameters: &mut FiniteBitSet<u32>,
|
||||
) {
|
||||
let def_id = tcx.closure_base_def_id(def_id);
|
||||
let predicates = tcx.explicit_predicates_of(def_id);
|
||||
|
||||
let mut current_unused_parameters = FiniteBitSet::new_empty();
|
||||
// Run to a fixed point to support `where T: Trait<U>, U: Trait<V>`, starting with an empty
|
||||
// bit set so that this is skipped if all parameters are already used.
|
||||
while current_unused_parameters != *unused_parameters {
|
||||
debug!(?current_unused_parameters, ?unused_parameters);
|
||||
current_unused_parameters = *unused_parameters;
|
||||
|
||||
for (predicate, _) in predicates.predicates {
|
||||
// Consider all generic params in a predicate as used if any other parameter in the
|
||||
// predicate is used.
|
||||
let any_param_used = {
|
||||
let mut vis = HasUsedGenericParams { tcx, unused_parameters };
|
||||
predicate.visit_with(&mut vis).is_break()
|
||||
};
|
||||
|
||||
if any_param_used {
|
||||
let mut vis = MarkUsedGenericParams { tcx, def_id, unused_parameters };
|
||||
predicate.visit_with(&mut vis);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(parent) = predicates.parent {
|
||||
mark_used_by_predicates(tcx, parent, unused_parameters);
|
||||
}
|
||||
}
|
||||
|
||||
/// Emit errors for the function annotated by `#[rustc_polymorphize_error]`, labelling each generic
|
||||
/// parameter which was unused.
|
||||
#[instrument(level = "debug", skip(tcx, generics))]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue