Skip to main content

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 !{
    {
            'done:
                {
                for i in tcx.get_all_attrs(id.owner_id) {
                    let i: &rustc_hir::Attribute = i;
                    match i {
                        rustc_hir::Attribute::Parsed(AttributeKind::RustcOutlives)
                            => {
                            break 'done Some(());
                        }
                        _ => {}
                    }
                }
                None
            }
        }.is_some()
}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 => ::rustc_middle::util::bug::bug_fmt(format_args!("unexpected clause {0:?}",
        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}