Add #[rustc_dump_{predicates,item_bounds}]
This commit is contained in:
parent
bc12972bcd
commit
38bd7a0fcb
6 changed files with 95 additions and 0 deletions
|
@ -1088,6 +1088,14 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||||
ErrorFollowing, EncodeCrossCrate::No,
|
ErrorFollowing, EncodeCrossCrate::No,
|
||||||
"the `#[custom_mir]` attribute is just used for the Rust test suite",
|
"the `#[custom_mir]` attribute is just used for the Rust test suite",
|
||||||
),
|
),
|
||||||
|
rustc_attr!(
|
||||||
|
TEST, rustc_dump_item_bounds, Normal, template!(Word),
|
||||||
|
WarnFollowing, EncodeCrossCrate::No
|
||||||
|
),
|
||||||
|
rustc_attr!(
|
||||||
|
TEST, rustc_dump_predicates, Normal, template!(Word),
|
||||||
|
WarnFollowing, EncodeCrossCrate::No
|
||||||
|
),
|
||||||
rustc_attr!(
|
rustc_attr!(
|
||||||
TEST, rustc_object_lifetime_default, Normal, template!(Word),
|
TEST, rustc_object_lifetime_default, Normal, template!(Word),
|
||||||
WarnFollowing, EncodeCrossCrate::No
|
WarnFollowing, EncodeCrossCrate::No
|
||||||
|
|
|
@ -16,3 +16,28 @@ pub(crate) fn opaque_hidden_types(tcx: TyCtxt<'_>) {
|
||||||
tcx.dcx().emit_err(crate::errors::TypeOf { span: tcx.def_span(id.owner_id), ty });
|
tcx.dcx().emit_err(crate::errors::TypeOf { span: tcx.def_span(id.owner_id), ty });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn predicates_and_item_bounds(tcx: TyCtxt<'_>) {
|
||||||
|
for id in tcx.hir_crate_items(()).owners() {
|
||||||
|
if tcx.has_attr(id, sym::rustc_dump_predicates) {
|
||||||
|
let preds = tcx.predicates_of(id).instantiate_identity(tcx).predicates;
|
||||||
|
let span = tcx.def_span(id);
|
||||||
|
|
||||||
|
let mut diag = tcx.dcx().struct_span_err(span, sym::rustc_dump_predicates.as_str());
|
||||||
|
for pred in preds {
|
||||||
|
diag.note(format!("{pred:?}"));
|
||||||
|
}
|
||||||
|
diag.emit();
|
||||||
|
}
|
||||||
|
if tcx.has_attr(id, sym::rustc_dump_item_bounds) {
|
||||||
|
let bounds = tcx.item_bounds(id).instantiate_identity();
|
||||||
|
let span = tcx.def_span(id);
|
||||||
|
|
||||||
|
let mut diag = tcx.dcx().struct_span_err(span, sym::rustc_dump_item_bounds.as_str());
|
||||||
|
for bound in bounds {
|
||||||
|
diag.note(format!("{bound:?}"));
|
||||||
|
}
|
||||||
|
diag.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -168,6 +168,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
|
||||||
tcx.sess.time("outlives_dumping", || outlives::dump::inferred_outlives(tcx));
|
tcx.sess.time("outlives_dumping", || outlives::dump::inferred_outlives(tcx));
|
||||||
tcx.sess.time("variance_dumping", || variance::dump::variances(tcx));
|
tcx.sess.time("variance_dumping", || variance::dump::variances(tcx));
|
||||||
collect::dump::opaque_hidden_types(tcx);
|
collect::dump::opaque_hidden_types(tcx);
|
||||||
|
collect::dump::predicates_and_item_bounds(tcx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure we evaluate all static and (non-associated) const items, even if unused.
|
// Make sure we evaluate all static and (non-associated) const items, even if unused.
|
||||||
|
|
|
@ -1592,6 +1592,8 @@ symbols! {
|
||||||
rustc_do_not_const_check,
|
rustc_do_not_const_check,
|
||||||
rustc_doc_primitive,
|
rustc_doc_primitive,
|
||||||
rustc_dummy,
|
rustc_dummy,
|
||||||
|
rustc_dump_item_bounds,
|
||||||
|
rustc_dump_predicates,
|
||||||
rustc_dump_user_args,
|
rustc_dump_user_args,
|
||||||
rustc_dump_vtable,
|
rustc_dump_vtable,
|
||||||
rustc_effective_visibility,
|
rustc_effective_visibility,
|
||||||
|
|
20
tests/ui/attributes/dump-preds.rs
Normal file
20
tests/ui/attributes/dump-preds.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
//@ normalize-stderr-test "DefId\(.+?\)" -> "DefId(..)"
|
||||||
|
|
||||||
|
#![feature(rustc_attrs)]
|
||||||
|
|
||||||
|
#[rustc_dump_predicates]
|
||||||
|
trait Trait<T>: Iterator<Item: Copy>
|
||||||
|
//~^ ERROR rustc_dump_predicates
|
||||||
|
where
|
||||||
|
String: From<T>
|
||||||
|
{
|
||||||
|
#[rustc_dump_predicates]
|
||||||
|
#[rustc_dump_item_bounds]
|
||||||
|
type Assoc<P: Eq>: std::ops::Deref<Target = ()>
|
||||||
|
//~^ ERROR rustc_dump_predicates
|
||||||
|
//~| ERROR rustc_dump_item_bounds
|
||||||
|
where
|
||||||
|
Self::Assoc<()>: Copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
39
tests/ui/attributes/dump-preds.stderr
Normal file
39
tests/ui/attributes/dump-preds.stderr
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
error: rustc_dump_predicates
|
||||||
|
--> $DIR/dump-preds.rs:6:1
|
||||||
|
|
|
||||||
|
LL | trait Trait<T>: Iterator<Item: Copy>
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: Binder { value: TraitPredicate(<Self as std::iter::Iterator>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<<Self as std::iter::Iterator>::Item as std::marker::Copy>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<T as std::marker::Sized>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<std::string::String as std::convert::From<T>>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<Self as Trait<T>>, polarity:Positive), bound_vars: [] }
|
||||||
|
|
||||||
|
error: rustc_dump_predicates
|
||||||
|
--> $DIR/dump-preds.rs:13:5
|
||||||
|
|
|
||||||
|
LL | type Assoc<P: Eq>: std::ops::Deref<Target = ()>
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: Binder { value: TraitPredicate(<Self as std::iter::Iterator>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<<Self as std::iter::Iterator>::Item as std::marker::Copy>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<T as std::marker::Sized>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<std::string::String as std::convert::From<T>>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<Self as Trait<T>>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<P as std::marker::Sized>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<P as std::cmp::Eq>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<<Self as Trait<T>>::Assoc<()> as std::marker::Copy>, polarity:Positive), bound_vars: [] }
|
||||||
|
|
||||||
|
error: rustc_dump_item_bounds
|
||||||
|
--> $DIR/dump-preds.rs:13:5
|
||||||
|
|
|
||||||
|
LL | type Assoc<P: Eq>: std::ops::Deref<Target = ()>
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: Binder { value: ProjectionPredicate(AliasTerm { args: [Alias(Projection, AliasTy { args: [Self/#0, T/#1, P/#2], def_id: DefId(..) })], def_id: DefId(..) }, Term::Ty(())), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<<Self as Trait<T>>::Assoc<P> as std::ops::Deref>, polarity:Positive), bound_vars: [] }
|
||||||
|
= note: Binder { value: TraitPredicate(<<Self as Trait<T>>::Assoc<P> as std::marker::Sized>, polarity:Positive), bound_vars: [] }
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue