]> git.lizzy.rs Git - rust.git/commitdiff
Print constants in `type_name` for const generics
authorvarkor <github@varkor.com>
Fri, 24 Jan 2020 16:22:24 +0000 (16:22 +0000)
committervarkor <github@varkor.com>
Fri, 24 Jan 2020 16:23:32 +0000 (16:23 +0000)
src/librustc/ty/print/pretty.rs
src/librustc_codegen_utils/symbol_names/legacy.rs
src/librustc_mir/interpret/intrinsics/type_name.rs
src/test/ui/const-generics/const-generic-type_name.rs [new file with mode: 0644]
src/test/ui/const-generics/const-generic-type_name.stderr [new file with mode: 0644]

index 9091de55b7d8ea5f4762e9f3f25e3a239c7170c3..7dd3c8f4a72951d68c5a8f54c2c0a8ea2ac6c2fb 100644 (file)
@@ -831,7 +831,11 @@ fn pretty_fn_sig(
         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);
 
         if self.tcx().sess.verbose() {
@@ -839,6 +843,15 @@ fn pretty_print_const(mut self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const
             return Ok(self);
         }
 
+        macro_rules! print_underscore {
+            () => {{
+                p!(write("_"));
+                if print_ty {
+                    p!(write(": "), print(ct.ty));
+                }
+            }};
+        }
+
         match (ct.val, &ct.ty.kind) {
             (_, ty::FnDef(did, substs)) => p!(print_value_path(*did, substs)),
             (ty::ConstKind::Unevaluated(did, substs, promoted), _) => {
@@ -857,22 +870,27 @@ fn pretty_print_const(mut self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const
                                 {
                                     p!(write("{}", snip))
                                 } else {
-                                    p!(write("_: "), print(ct.ty))
+                                    print_underscore!()
                                 }
                             } 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::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
-                p!(write("{:?} : ", ct.val), print(ct.ty))
+                p!(write("{:?}", ct.val));
+                if print_ty {
+                    p!(write(" : "), print(ct.ty));
+                }
             }
         };
         Ok(self)
@@ -882,6 +900,7 @@ fn pretty_print_const_value(
         mut self,
         ct: ConstValue<'tcx>,
         ty: Ty<'tcx>,
+        print_ty: bool,
     ) -> Result<Self::Const, Self::Error> {
         define_scoped_cx!(self);
 
@@ -988,7 +1007,10 @@ fn pretty_print_const_value(
                 };
                 if !printed {
                     // fallback
-                    p!(write("{:?} : ", ct), print(ty))
+                    p!(write("{:?}", ct));
+                    if print_ty {
+                        p!(write(" : "), print(ty));
+                    }
                 }
             }
         };
@@ -1162,7 +1184,7 @@ fn print_dyn_existential(
     }
 
     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> {
index 4f5b9ce03fc3f5e90702bb2f902a9845fe009571..0dedda9bb6b73e67c0017ab9f063dd494124dd3f 100644 (file)
@@ -237,7 +237,7 @@ fn print_const(mut self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self:
         // only print integers
         if let ty::ConstKind::Value(ConstValue::Scalar(Scalar::Raw { .. })) = ct.val {
             if ct.ty.is_integral() {
-                return self.pretty_print_const(ct);
+                return self.pretty_print_const(ct, true);
             }
         }
         self.write_str("_")?;
index eed47c147c60d48d9e9aa9a03e5470ee4d0bf474..cd8bf7085d1b1c4fb8c383e730373027caeb3e08 100644 (file)
@@ -69,9 +69,8 @@ fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
         }
     }
 
-    fn print_const(self, _: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
-        // don't print constants to the user
-        Ok(self)
+    fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
+        self.pretty_print_const(ct, false)
     }
 
     fn print_dyn_existential(
diff --git a/src/test/ui/const-generics/const-generic-type_name.rs b/src/test/ui/const-generics/const-generic-type_name.rs
new file mode 100644 (file)
index 0000000..2858642
--- /dev/null
@@ -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>");
+}
diff --git a/src/test/ui/const-generics/const-generic-type_name.stderr b/src/test/ui/const-generics/const-generic-type_name.stderr
new file mode 100644 (file)
index 0000000..6b60a77
--- /dev/null
@@ -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
+