mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-22 04:27:33 +00:00
Print constants in type_name
for const generics
This commit is contained in:
parent
dee12bb2b7
commit
50dd8eaeb9
@ -831,7 +831,11 @@ pub trait PrettyPrinter<'tcx>:
|
|||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pretty_print_const(mut self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
|
fn pretty_print_const(
|
||||||
|
mut self,
|
||||||
|
ct: &'tcx ty::Const<'tcx>,
|
||||||
|
print_ty: bool,
|
||||||
|
) -> Result<Self::Const, Self::Error> {
|
||||||
define_scoped_cx!(self);
|
define_scoped_cx!(self);
|
||||||
|
|
||||||
if self.tcx().sess.verbose() {
|
if self.tcx().sess.verbose() {
|
||||||
@ -839,6 +843,15 @@ pub trait PrettyPrinter<'tcx>:
|
|||||||
return Ok(self);
|
return Ok(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! print_underscore {
|
||||||
|
() => {{
|
||||||
|
p!(write("_"));
|
||||||
|
if print_ty {
|
||||||
|
p!(write(": "), print(ct.ty));
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
match (ct.val, &ct.ty.kind) {
|
match (ct.val, &ct.ty.kind) {
|
||||||
(_, ty::FnDef(did, substs)) => p!(print_value_path(*did, substs)),
|
(_, ty::FnDef(did, substs)) => p!(print_value_path(*did, substs)),
|
||||||
(ty::ConstKind::Unevaluated(did, substs, promoted), _) => {
|
(ty::ConstKind::Unevaluated(did, substs, promoted), _) => {
|
||||||
@ -857,22 +870,27 @@ pub trait PrettyPrinter<'tcx>:
|
|||||||
{
|
{
|
||||||
p!(write("{}", snip))
|
p!(write("{}", snip))
|
||||||
} else {
|
} else {
|
||||||
p!(write("_: "), print(ct.ty))
|
print_underscore!()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p!(write("_: "), print(ct.ty))
|
print_underscore!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(ty::ConstKind::Infer(..), _) => p!(write("_: "), print(ct.ty)),
|
(ty::ConstKind::Infer(..), _) => print_underscore!(),
|
||||||
(ty::ConstKind::Param(ParamConst { name, .. }), _) => p!(write("{}", name)),
|
(ty::ConstKind::Param(ParamConst { name, .. }), _) => p!(write("{}", name)),
|
||||||
(ty::ConstKind::Value(value), _) => return self.pretty_print_const_value(value, ct.ty),
|
(ty::ConstKind::Value(value), _) => {
|
||||||
|
return self.pretty_print_const_value(value, ct.ty, print_ty);
|
||||||
|
}
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
// fallback
|
// fallback
|
||||||
p!(write("{:?} : ", ct.val), print(ct.ty))
|
p!(write("{:?}", ct.val));
|
||||||
|
if print_ty {
|
||||||
|
p!(write(" : "), print(ct.ty));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Ok(self)
|
Ok(self)
|
||||||
@ -882,6 +900,7 @@ pub trait PrettyPrinter<'tcx>:
|
|||||||
mut self,
|
mut self,
|
||||||
ct: ConstValue<'tcx>,
|
ct: ConstValue<'tcx>,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
|
print_ty: bool,
|
||||||
) -> Result<Self::Const, Self::Error> {
|
) -> Result<Self::Const, Self::Error> {
|
||||||
define_scoped_cx!(self);
|
define_scoped_cx!(self);
|
||||||
|
|
||||||
@ -988,7 +1007,10 @@ pub trait PrettyPrinter<'tcx>:
|
|||||||
};
|
};
|
||||||
if !printed {
|
if !printed {
|
||||||
// fallback
|
// fallback
|
||||||
p!(write("{:?} : ", ct), print(ty))
|
p!(write("{:?}", ct));
|
||||||
|
if print_ty {
|
||||||
|
p!(write(" : "), print(ty));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1162,7 +1184,7 @@ impl<F: fmt::Write> Printer<'tcx> for FmtPrinter<'_, 'tcx, F> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
|
fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
|
||||||
self.pretty_print_const(ct)
|
self.pretty_print_const(ct, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn path_crate(mut self, cnum: CrateNum) -> Result<Self::Path, Self::Error> {
|
fn path_crate(mut self, cnum: CrateNum) -> Result<Self::Path, Self::Error> {
|
||||||
|
@ -237,7 +237,7 @@ impl Printer<'tcx> for SymbolPrinter<'tcx> {
|
|||||||
// only print integers
|
// only print integers
|
||||||
if let ty::ConstKind::Value(ConstValue::Scalar(Scalar::Raw { .. })) = ct.val {
|
if let ty::ConstKind::Value(ConstValue::Scalar(Scalar::Raw { .. })) = ct.val {
|
||||||
if ct.ty.is_integral() {
|
if ct.ty.is_integral() {
|
||||||
return self.pretty_print_const(ct);
|
return self.pretty_print_const(ct, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.write_str("_")?;
|
self.write_str("_")?;
|
||||||
|
@ -69,9 +69,8 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_const(self, _: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
|
fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
|
||||||
// don't print constants to the user
|
self.pretty_print_const(ct, false)
|
||||||
Ok(self)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_dyn_existential(
|
fn print_dyn_existential(
|
||||||
|
11
src/test/ui/const-generics/const-generic-type_name.rs
Normal file
11
src/test/ui/const-generics/const-generic-type_name.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct S<const N: usize>;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
assert_eq!(std::any::type_name::<S<3>>(), "const_generic_type_name::S<3usize>");
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
--> $DIR/const-generic-type_name.rs:3:12
|
||||||
|
|
|
||||||
|
LL | #![feature(const_generics)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
Loading…
Reference in New Issue
Block a user