rustc_hir_analysis/outlives/dump.rs
1use rustc_hir::attrs::AttributeKind;
2use rustc_hir::find_attr;
3use rustc_middle::bug;
4use rustc_middle::ty::{self, TyCtxt};
5use rustc_span::sym;
6
7pub(crate) fn inferred_outlives(tcx: TyCtxt<'_>) {
8 for id in tcx.hir_free_items() {
9 if !find_attr!(tcx.get_all_attrs(id.owner_id), AttributeKind::RustcOutlives) {
10 continue;
11 }
12
13 let preds = tcx.inferred_outlives_of(id.owner_id);
14 let mut preds: Vec<_> = preds
15 .iter()
16 .map(|(pred, _)| match pred.kind().skip_binder() {
17 ty::ClauseKind::RegionOutlives(p) => p.to_string(),
18 ty::ClauseKind::TypeOutlives(p) => p.to_string(),
19 err => bug!("unexpected clause {:?}", err),
20 })
21 .collect();
22 preds.sort();
23
24 let span = tcx.def_span(id.owner_id);
25 let mut err = tcx.dcx().struct_span_err(span, sym::rustc_outlives.as_str());
26 for pred in preds {
27 err.note(pred);
28 }
29 err.emit();
30 }
31}