diff --git a/src/libcore/any.rs b/src/libcore/any.rs index f7aef66942d9b..078091a9b5475 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::() 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 0000000000000..4ccfb42098423 --- /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); +}