From 873b3614808415f9269759a6903ac75ddcb7d7ff Mon Sep 17 00:00:00 2001 From: TankhouseAle <51239665+TankhouseAle@users.noreply.github.com> Date: Mon, 29 Jul 2019 22:57:21 -0400 Subject: [PATCH 1/2] Add a test for std::any::type_name() as a const fn This is a modified version of the test I added previously. The difference is this version implements a wrapper around std::any::type_name versus core::intrinsics::type_name, in order to show that it works as desired / intended. --- src/test/ui/consts/const-fn-type-name-any.rs | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/test/ui/consts/const-fn-type-name-any.rs diff --git a/src/test/ui/consts/const-fn-type-name-any.rs b/src/test/ui/consts/const-fn-type-name-any.rs new file mode 100644 index 00000000000..4ccfb420984 --- /dev/null +++ b/src/test/ui/consts/const-fn-type-name-any.rs @@ -0,0 +1,29 @@ +// run-pass + +#![feature(const_fn)] +#![feature(const_type_name)] +#![allow(dead_code)] + +const fn type_name_wrapper(_: &T) -> &'static str { + std::any::type_name::() +} + +struct Struct { + a: TA, + b: TB, + c: TC, +} + +type StructInstantiation = Struct; + +const CONST_STRUCT: StructInstantiation = StructInstantiation { a: 12, b: 13.7, c: false }; + +const CONST_STRUCT_NAME: &'static str = type_name_wrapper(&CONST_STRUCT); + +fn main() { + let non_const_struct = StructInstantiation { a: 87, b: 65.99, c: true }; + + let non_const_struct_name = type_name_wrapper(&non_const_struct); + + assert_eq!(CONST_STRUCT_NAME, non_const_struct_name); +} From 4a3d41d334860f18a7fc9319167f9e275dd9510b Mon Sep 17 00:00:00 2001 From: TankhouseAle <51239665+TankhouseAle@users.noreply.github.com> Date: Mon, 29 Jul 2019 23:02:29 -0400 Subject: [PATCH 2/2] Add the necessary changes to any.rs Specifically the `#[rustc_const_unstable(feature = "const_type_name")]` attribute, as well as marking the actual function as `const`. --- src/libcore/any.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libcore/any.rs b/src/libcore/any.rs index f7aef66942d..078091a9b54 100644 --- a/src/libcore/any.rs +++ b/src/libcore/any.rs @@ -468,7 +468,8 @@ impl TypeId { /// The current implementation uses the same infrastructure as compiler /// diagnostics and debuginfo, but this is not guaranteed. #[stable(feature = "type_name", since = "1.38.0")] -pub fn type_name() -> &'static str { +#[rustc_const_unstable(feature = "const_type_name")] +pub const fn type_name() -> &'static str { #[cfg(bootstrap)] unsafe { intrinsics::type_name::()