mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
add rustc_dump_def_parents
attribute
This commit is contained in:
parent
6c3485512f
commit
552794410a
@ -1117,6 +1117,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||||||
TEST, rustc_dump_predicates, Normal, template!(Word),
|
TEST, rustc_dump_predicates, Normal, template!(Word),
|
||||||
WarnFollowing, EncodeCrossCrate::No
|
WarnFollowing, EncodeCrossCrate::No
|
||||||
),
|
),
|
||||||
|
rustc_attr!(
|
||||||
|
TEST, rustc_dump_def_parents, 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
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::CRATE_DEF_ID;
|
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
|
||||||
|
use rustc_hir::intravisit;
|
||||||
|
use rustc_middle::hir::nested_filter::OnlyBodies;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
|
|
||||||
@ -41,3 +43,49 @@ pub(crate) fn predicates_and_item_bounds(tcx: TyCtxt<'_>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn def_parents(tcx: TyCtxt<'_>) {
|
||||||
|
for did in tcx.hir().body_owners() {
|
||||||
|
if tcx.has_attr(did, sym::rustc_dump_def_parents) {
|
||||||
|
struct AnonConstFinder<'tcx> {
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
anon_consts: Vec<LocalDefId>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> intravisit::Visitor<'tcx> for AnonConstFinder<'tcx> {
|
||||||
|
type NestedFilter = OnlyBodies;
|
||||||
|
|
||||||
|
fn nested_visit_map(&mut self) -> Self::Map {
|
||||||
|
self.tcx.hir()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_anon_const(&mut self, c: &'tcx rustc_hir::AnonConst) {
|
||||||
|
self.anon_consts.push(c.def_id);
|
||||||
|
intravisit::walk_anon_const(self, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for any anon consts inside of this body owner as there is no way to apply
|
||||||
|
// the `rustc_dump_def_parents` attribute to the anon const so it would not be possible
|
||||||
|
// to see what its def parent is.
|
||||||
|
let mut anon_ct_finder = AnonConstFinder { tcx, anon_consts: vec![] };
|
||||||
|
intravisit::walk_expr(&mut anon_ct_finder, tcx.hir().body_owned_by(did).value);
|
||||||
|
|
||||||
|
for did in [did].into_iter().chain(anon_ct_finder.anon_consts) {
|
||||||
|
let span = tcx.def_span(did);
|
||||||
|
|
||||||
|
let mut diag = tcx.dcx().struct_span_err(
|
||||||
|
span,
|
||||||
|
format!("{}: {did:?}", sym::rustc_dump_def_parents.as_str()),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut current_did = did.to_def_id();
|
||||||
|
while let Some(parent_did) = tcx.opt_parent(current_did) {
|
||||||
|
current_did = parent_did;
|
||||||
|
diag.span_note(tcx.def_span(parent_did), format!("{parent_did:?}"));
|
||||||
|
}
|
||||||
|
diag.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -169,6 +169,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
|
|||||||
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);
|
collect::dump::predicates_and_item_bounds(tcx);
|
||||||
|
collect::dump::def_parents(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.
|
||||||
|
@ -1614,6 +1614,7 @@ symbols! {
|
|||||||
rustc_do_not_const_check,
|
rustc_do_not_const_check,
|
||||||
rustc_doc_primitive,
|
rustc_doc_primitive,
|
||||||
rustc_dummy,
|
rustc_dummy,
|
||||||
|
rustc_dump_def_parents,
|
||||||
rustc_dump_item_bounds,
|
rustc_dump_item_bounds,
|
||||||
rustc_dump_predicates,
|
rustc_dump_predicates,
|
||||||
rustc_dump_user_args,
|
rustc_dump_user_args,
|
||||||
|
34
tests/ui/attributes/dump_def_parents.rs
Normal file
34
tests/ui/attributes/dump_def_parents.rs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//@ normalize-stderr-test "DefId\(.+?\)" -> "DefId(..)"
|
||||||
|
#![feature(rustc_attrs)]
|
||||||
|
|
||||||
|
fn bar() {
|
||||||
|
fn foo() {
|
||||||
|
fn baz() {
|
||||||
|
#[rustc_dump_def_parents]
|
||||||
|
|| {
|
||||||
|
//~^ ERROR: rustc_dump_def_parents: DefId
|
||||||
|
qux::<
|
||||||
|
{
|
||||||
|
//~^ ERROR: rustc_dump_def_parents: DefId
|
||||||
|
fn inhibits_dump() {
|
||||||
|
qux::<
|
||||||
|
{
|
||||||
|
"hi";
|
||||||
|
1
|
||||||
|
},
|
||||||
|
>();
|
||||||
|
}
|
||||||
|
|
||||||
|
qux::<{ 1 + 1 }>();
|
||||||
|
//~^ ERROR: rustc_dump_def_parents: DefId
|
||||||
|
1
|
||||||
|
},
|
||||||
|
>();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn qux<const N: usize>() {}
|
||||||
|
|
||||||
|
fn main() {}
|
128
tests/ui/attributes/dump_def_parents.stderr
Normal file
128
tests/ui/attributes/dump_def_parents.stderr
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
error: rustc_dump_def_parents: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:8:13
|
||||||
|
|
|
||||||
|
LL | || {
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:6:9
|
||||||
|
|
|
||||||
|
LL | fn baz() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:5:5
|
||||||
|
|
|
||||||
|
LL | fn foo() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:4:1
|
||||||
|
|
|
||||||
|
LL | fn bar() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:2:1
|
||||||
|
|
|
||||||
|
LL | / #![feature(rustc_attrs)]
|
||||||
|
LL | |
|
||||||
|
LL | | fn bar() {
|
||||||
|
LL | | fn foo() {
|
||||||
|
... |
|
||||||
|
LL | |
|
||||||
|
LL | | fn main() {}
|
||||||
|
| |____________^
|
||||||
|
|
||||||
|
error: rustc_dump_def_parents: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:11:21
|
||||||
|
|
|
||||||
|
LL | / {
|
||||||
|
LL | |
|
||||||
|
LL | | fn inhibits_dump() {
|
||||||
|
LL | | qux::<
|
||||||
|
... |
|
||||||
|
LL | | 1
|
||||||
|
LL | | },
|
||||||
|
| |_____________________^
|
||||||
|
|
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:8:13
|
||||||
|
|
|
||||||
|
LL | || {
|
||||||
|
| ^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:6:9
|
||||||
|
|
|
||||||
|
LL | fn baz() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:5:5
|
||||||
|
|
|
||||||
|
LL | fn foo() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:4:1
|
||||||
|
|
|
||||||
|
LL | fn bar() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:2:1
|
||||||
|
|
|
||||||
|
LL | / #![feature(rustc_attrs)]
|
||||||
|
LL | |
|
||||||
|
LL | | fn bar() {
|
||||||
|
LL | | fn foo() {
|
||||||
|
... |
|
||||||
|
LL | |
|
||||||
|
LL | | fn main() {}
|
||||||
|
| |____________^
|
||||||
|
|
||||||
|
error: rustc_dump_def_parents: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:22:31
|
||||||
|
|
|
||||||
|
LL | qux::<{ 1 + 1 }>();
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:11:21
|
||||||
|
|
|
||||||
|
LL | / {
|
||||||
|
LL | |
|
||||||
|
LL | | fn inhibits_dump() {
|
||||||
|
LL | | qux::<
|
||||||
|
... |
|
||||||
|
LL | | 1
|
||||||
|
LL | | },
|
||||||
|
| |_____________________^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:8:13
|
||||||
|
|
|
||||||
|
LL | || {
|
||||||
|
| ^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:6:9
|
||||||
|
|
|
||||||
|
LL | fn baz() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:5:5
|
||||||
|
|
|
||||||
|
LL | fn foo() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:4:1
|
||||||
|
|
|
||||||
|
LL | fn bar() {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: DefId(..)
|
||||||
|
--> $DIR/dump_def_parents.rs:2:1
|
||||||
|
|
|
||||||
|
LL | / #![feature(rustc_attrs)]
|
||||||
|
LL | |
|
||||||
|
LL | | fn bar() {
|
||||||
|
LL | | fn foo() {
|
||||||
|
... |
|
||||||
|
LL | |
|
||||||
|
LL | | fn main() {}
|
||||||
|
| |____________^
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Reference in New Issue
Block a user