v0: only add types to consts as suffixes on integer literals.
diff --git a/src/v0.rs b/src/v0.rs
index 9605859..24b5373 100644
--- a/src/v0.rs
+++ b/src/v0.rs
@@ -946,73 +946,64 @@
}
fn print_const(&mut self) -> fmt::Result {
+ let tag = parse!(self, next);
+
parse!(self, push_depth);
- if self.eat(b'B') {
- self.print_backref(Self::print_const)?;
-
- self.pop_depth();
- return Ok(());
- }
-
- let ty_tag = parse!(self, next);
-
- if ty_tag == b'p' {
- // We don't encode the type if the value is a placeholder.
- self.print("_")?;
-
- self.pop_depth();
- return Ok(());
- }
-
- match ty_tag {
+ match tag {
+ // Placeholder.
+ b'p' => self.print("_")?,
// Unsigned integer types.
- b'h' | b't' | b'm' | b'y' | b'o' | b'j' => self.print_const_uint()?,
+ b'h' | b't' | b'm' | b'y' | b'o' | b'j' => self.print_const_uint(tag)?,
// Signed integer types.
- b'a' | b's' | b'l' | b'x' | b'n' | b'i' => self.print_const_int()?,
+ b'a' | b's' | b'l' | b'x' | b'n' | b'i' => self.print_const_int(tag)?,
// Bool.
b'b' => self.print_const_bool()?,
// Char.
b'c' => self.print_const_char()?,
- // This branch ought to be unreachable.
+ b'B' => {
+ self.print_backref(Self::print_const)?;
+ }
+
_ => invalid!(self),
};
- if let Some(out) = &mut self.out {
- if !out.alternate() {
- self.print(": ")?;
- let ty = basic_type(ty_tag).unwrap();
- self.print(ty)?;
- }
- }
-
self.pop_depth();
Ok(())
}
- fn print_const_uint(&mut self) -> fmt::Result {
+ fn print_const_uint(&mut self, ty_tag: u8) -> fmt::Result {
let hex = parse!(self, hex_nibbles);
// Print anything that doesn't fit in `u64` verbatim.
if hex.len() > 16 {
self.print("0x")?;
- return self.print(hex);
+ self.print(hex)?;
+ } else {
+ let mut v = 0;
+ for c in hex.chars() {
+ v = (v << 4) | (c.to_digit(16).unwrap() as u64);
+ }
+ self.print(v)?;
}
- let mut v = 0;
- for c in hex.chars() {
- v = (v << 4) | (c.to_digit(16).unwrap() as u64);
+ if let Some(out) = &mut self.out {
+ if !out.alternate() {
+ let ty = basic_type(ty_tag).unwrap();
+ self.print(ty)?;
+ }
}
- self.print(v)
+
+ Ok(())
}
- fn print_const_int(&mut self) -> fmt::Result {
+ fn print_const_int(&mut self, ty_tag: u8) -> fmt::Result {
if self.eat(b'n') {
self.print("-")?;
}
- self.print_const_uint()
+ self.print_const_uint(ty_tag)
}
fn print_const_bool(&mut self) -> fmt::Result {
@@ -1073,12 +1064,12 @@
)
};
}
- macro_rules! t_const_typed {
- ($mangled:expr, $value:expr, $value_ty:expr) => {{
+ macro_rules! t_const_suffixed {
+ ($mangled:expr, $value:expr, $value_ty_suffix:expr) => {{
t_const!($mangled, $value);
t!(
concat!("_RIC0K", $mangled, "E"),
- concat!("[0]::<", $value, ": ", $value_ty, ">")
+ concat!("[0]::<", $value, $value_ty_suffix, ">")
);
}};
}
@@ -1124,20 +1115,21 @@
"INtC8arrayvec8ArrayVechKj7b_E",
"arrayvec::ArrayVec<u8, 123>"
);
- t_const_typed!("j7b_", "123", "usize");
+ t_const_suffixed!("j7b_", "123", "usize");
}
#[test]
fn demangle_min_const_generics() {
t_const!("p", "_");
- t_const_typed!("hb_", "11", "u8");
- t_const_typed!("s98_", "152", "i16");
- t_const_typed!("anb_", "-11", "i8");
- t_const_typed!("b0_", "false", "bool");
- t_const_typed!("b1_", "true", "bool");
- t_const_typed!("c76_", "'v'", "char");
- t_const_typed!("ca_", "'\\n'", "char");
- t_const_typed!("c2202_", "'∂'", "char");
+ t_const_suffixed!("hb_", "11", "u8");
+ t_const_suffixed!("off00ff00ff00ff00ff_", "0xff00ff00ff00ff00ff", "u128");
+ t_const_suffixed!("s98_", "152", "i16");
+ t_const_suffixed!("anb_", "-11", "i8");
+ t_const!("b0_", "false");
+ t_const!("b1_", "true");
+ t_const!("c76_", "'v'");
+ t_const!("ca_", "'\\n'");
+ t_const!("c2202_", "'∂'");
}
#[test]