about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorCharles Lew <crlf0710@gmail.com>2021-07-17 15:44:19 +0800
committerCharles Lew <crlf0710@gmail.com>2021-07-20 22:14:43 +0800
commitab171c5279df8ed2449ca995c3e5402abc3cf8e9 (patch)
tree572e37198444bbfe7fd345d244d98428a0609b92 /compiler
parentd2dc4276fdb5d5c4d8d7ff6906213db6c6ed4d7e (diff)
downloadrust-ab171c5279df8ed2449ca995c3e5402abc3cf8e9.tar.gz
rust-ab171c5279df8ed2449ca995c3e5402abc3cf8e9.zip
Add internal attribute and tests.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_feature/src/builtin_attrs.rs1
-rw-r--r--compiler/rustc_span/src/symbol.rs1
-rw-r--r--compiler/rustc_trait_selection/src/traits/mod.rs12
3 files changed, 13 insertions, 1 deletions
diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs
index b1c725ecd85..36d035cdfd3 100644
--- a/compiler/rustc_feature/src/builtin_attrs.rs
+++ b/compiler/rustc_feature/src/builtin_attrs.rs
@@ -603,6 +603,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
     rustc_attr!(TEST, rustc_dump_program_clauses, AssumedUsed, template!(Word)),
     rustc_attr!(TEST, rustc_dump_env_program_clauses, AssumedUsed, template!(Word)),
     rustc_attr!(TEST, rustc_object_lifetime_default, AssumedUsed, template!(Word)),
+    rustc_attr!(TEST, rustc_dump_vtable, AssumedUsed, template!(Word)),
     rustc_attr!(TEST, rustc_dummy, Normal, template!(Word /* doesn't matter*/)),
     gated!(
         omit_gdb_pretty_printer_section, AssumedUsed, template!(Word),
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs
index a8f969782b2..c0f63f40853 100644
--- a/compiler/rustc_span/src/symbol.rs
+++ b/compiler/rustc_span/src/symbol.rs
@@ -1047,6 +1047,7 @@ symbols! {
         rustc_dump_env_program_clauses,
         rustc_dump_program_clauses,
         rustc_dump_user_substs,
+        rustc_dump_vtable,
         rustc_error,
         rustc_evaluate_where_clauses,
         rustc_expected_cgu_reuse,
diff --git a/compiler/rustc_trait_selection/src/traits/mod.rs b/compiler/rustc_trait_selection/src/traits/mod.rs
index 9537aa20e7a..5c3b3926f4c 100644
--- a/compiler/rustc_trait_selection/src/traits/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/mod.rs
@@ -34,7 +34,7 @@ use rustc_middle::ty::{
     self, GenericParamDefKind, ToPredicate, Ty, TyCtxt, VtblEntry, WithConstness,
     COMMON_VTABLE_ENTRIES,
 };
-use rustc_span::Span;
+use rustc_span::{sym, Span};
 use smallvec::SmallVec;
 
 use std::fmt::Debug;
@@ -614,6 +614,11 @@ fn prepare_vtable_segments<'tcx, T>(
     }
 }
 
+fn dump_vtable_entries<'tcx>(tcx: TyCtxt<'tcx>, entries: &[VtblEntry<'tcx>]) {
+    let msg = format!("Vtable Entries: {:#?}", entries);
+    tcx.sess.struct_span_err(rustc_span::DUMMY_SP, &msg).emit();
+}
+
 /// Given a trait `trait_ref`, iterates the vtable entries
 /// that come from `trait_ref`, including its supertraits.
 fn vtable_entries<'tcx>(
@@ -691,6 +696,11 @@ fn vtable_entries<'tcx>(
     };
 
     let _ = prepare_vtable_segments(tcx, trait_ref, vtable_segment_callback);
+
+    if tcx.has_attr(trait_ref.def_id(), sym::rustc_dump_vtable) {
+        dump_vtable_entries(tcx, &entries);
+    }
+
     tcx.arena.alloc_from_iter(entries.into_iter())
 }