Added helper to prevent verbose printing from the PrettyPrinter
when printing constants
This commit is contained in:
parent
f2702e922b
commit
5e46d8675c
3 changed files with 24 additions and 5 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
13
src/test/ui/type/issue-94187-verbose-type-name.rs
Normal file
13
src/test/ui/type/issue-94187-verbose-type-name.rs
Normal 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>");
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue