1
Fork 0

Added helper to prevent verbose printing from the PrettyPrinter when printing constants

This commit is contained in:
Sarthak Singh 2022-10-23 12:29:59 +05:30
parent f2702e922b
commit 5e46d8675c
3 changed files with 24 additions and 5 deletions

View file

@ -4,7 +4,7 @@ use rustc_hir::definitions::DisambiguatedDefPathData;
use rustc_middle::mir::interpret::{Allocation, ConstAllocation}; use rustc_middle::mir::interpret::{Allocation, ConstAllocation};
use rustc_middle::ty::{ use rustc_middle::ty::{
self, self,
print::{PrettyPrinter, Print, Printer}, print::{with_no_verbose_constants, PrettyPrinter, Print, Printer},
subst::{GenericArg, GenericArgKind}, subst::{GenericArg, GenericArgKind},
Ty, TyCtxt, Ty, TyCtxt,
}; };
@ -190,7 +190,9 @@ impl Write for AbsolutePathPrinter<'_> {
/// Directly returns an `Allocation` containing an absolute path representation of the given type. /// Directly returns an `Allocation` containing an absolute path representation of the given type.
pub(crate) fn alloc_type_name<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> ConstAllocation<'tcx> { pub(crate) fn alloc_type_name<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> ConstAllocation<'tcx> {
let path = AbsolutePathPrinter { tcx, path: String::new() }.print_type(ty).unwrap().path; let path = with_no_verbose_constants!(
AbsolutePathPrinter { tcx, path: String::new() }.print_type(ty).unwrap().path
);
let alloc = Allocation::from_bytes_byte_aligned_immutable(path.into_bytes()); let alloc = Allocation::from_bytes_byte_aligned_immutable(path.into_bytes());
tcx.intern_const_alloc(alloc) tcx.intern_const_alloc(alloc)
} }

View file

@ -63,6 +63,7 @@ thread_local! {
static NO_TRIMMED_PATH: Cell<bool> = const { Cell::new(false) }; static NO_TRIMMED_PATH: Cell<bool> = const { Cell::new(false) };
static NO_QUERIES: Cell<bool> = const { Cell::new(false) }; static NO_QUERIES: Cell<bool> = const { Cell::new(false) };
static NO_VISIBLE_PATH: Cell<bool> = const { Cell::new(false) }; static NO_VISIBLE_PATH: Cell<bool> = const { Cell::new(false) };
static NO_VERBOSE_CONSTANTS: Cell<bool> = const { Cell::new(false) };
} }
macro_rules! define_helper { macro_rules! define_helper {
@ -117,6 +118,9 @@ define_helper!(
/// Prevent selection of visible paths. `Display` impl of DefId will prefer /// Prevent selection of visible paths. `Display` impl of DefId will prefer
/// visible (public) reexports of types as paths. /// visible (public) reexports of types as paths.
fn with_no_visible_paths(NoVisibleGuard, NO_VISIBLE_PATH); fn with_no_visible_paths(NoVisibleGuard, NO_VISIBLE_PATH);
/// Prevent verbose printing of constants. Verbose printing of constants is
/// never desirable in some contexts like `std::any::type_name`.
fn with_no_verbose_constants(NoVerboseConstantsGuard, NO_VERBOSE_CONSTANTS);
); );
/// The "region highlights" are used to control region printing during /// The "region highlights" are used to control region printing during
@ -759,7 +763,7 @@ pub trait PrettyPrinter<'tcx>:
} }
ty::Array(ty, sz) => { ty::Array(ty, sz) => {
p!("[", print(ty), "; "); p!("[", print(ty), "; ");
if self.tcx().sess.verbose() { if !NO_VERBOSE_CONSTANTS.with(|flag| flag.get()) && self.tcx().sess.verbose() {
p!(write("{:?}", sz)); p!(write("{:?}", sz));
} else if let ty::ConstKind::Unevaluated(..) = sz.kind() { } else if let ty::ConstKind::Unevaluated(..) = sz.kind() {
// Do not try to evaluate unevaluated constants. If we are const evaluating an // Do not try to evaluate unevaluated constants. If we are const evaluating an
@ -1181,7 +1185,7 @@ pub trait PrettyPrinter<'tcx>:
) -> Result<Self::Const, Self::Error> { ) -> Result<Self::Const, Self::Error> {
define_scoped_cx!(self); define_scoped_cx!(self);
if self.tcx().sess.verbose() { if !NO_VERBOSE_CONSTANTS.with(|flag| flag.get()) && self.tcx().sess.verbose() {
p!(write("Const({:?}: {:?})", ct.kind(), ct.ty())); p!(write("Const({:?}: {:?})", ct.kind(), ct.ty()));
return Ok(self); return Ok(self);
} }
@ -1416,7 +1420,7 @@ pub trait PrettyPrinter<'tcx>:
) -> Result<Self::Const, Self::Error> { ) -> Result<Self::Const, Self::Error> {
define_scoped_cx!(self); define_scoped_cx!(self);
if self.tcx().sess.verbose() { if !NO_VERBOSE_CONSTANTS.with(|flag| flag.get()) && self.tcx().sess.verbose() {
p!(write("ValTree({:?}: ", valtree), print(ty), ")"); p!(write("ValTree({:?}: ", valtree), print(ty), ")");
return Ok(self); return Ok(self);
} }

View file

@ -0,0 +1,13 @@
// Check to insure that the output of `std::any::type_name` does not change based on -Zverbose
// when printing constants
// run-pass
// edition: 2018
// revisions: normal verbose
// [verbose]compile-flags:-Zverbose
struct Wrapper<const VALUE: usize>;
fn main() {
assert_eq!(std::any::type_name::<[u32; 0]>(), "[u32; 0]");
assert_eq!(std::any::type_name::<Wrapper<0>>(), "issue_94187_verbose_type_name::Wrapper<0>");
}