Skip to content

Commit

Permalink
Stabilize type_name_of_val
Browse files Browse the repository at this point in the history
Make the following API stable:

    // in core::any
    pub fn type_name_of_val<T: ?Sized>(_val: &T) -> &'static str

Const stability is not added because this relies on `type_name` which is also
not const. That has a blocking issue.

Fixes #66359
  • Loading branch information
tgross35 committed Nov 24, 2023
1 parent 41fe75e commit de3848f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 22 deletions.
39 changes: 18 additions & 21 deletions library/core/src/any.rs
Original file line number Diff line number Diff line change
Expand Up @@ -690,44 +690,41 @@ pub const fn type_name<T: ?Sized>() -> &'static str {
intrinsics::type_name::<T>()
}

/// Returns the name of the type of the pointed-to value as a string slice.
/// Returns the type name of the pointed-to value as a string slice.
///
/// This is the same as `type_name::<T>()`, but can be used where the type of a
/// variable is not easily available.
///
/// # Note
///
/// This is intended for diagnostic use. The exact contents and format of the
/// string are not specified, other than being a best-effort description of the
/// type. For example, `type_name_of_val::<Option<String>>(None)` could return
/// `"Option<String>"` or `"std::option::Option<std::string::String>"`, but not
/// `"foobar"`. In addition, the output may change between versions of the
/// compiler.
///
/// This function does not resolve trait objects,
/// meaning that `type_name_of_val(&7u32 as &dyn Debug)`
/// may return `"dyn Debug"`, but not `"u32"`.
/// Like [`type_name`], this is intended for diagnostic use and the exact output is not
/// guaranteed. It provides a best-effort description, but the output may change between
/// versions of the compiler.
///
/// The type name should not be considered a unique identifier of a type;
/// multiple types may share the same type name.
/// In short: use this for debugging, avoid using the output to affect program behavior. More
/// information is available at [`type_name`].
///
/// The current implementation uses the same infrastructure as compiler
/// diagnostics and debuginfo, but this is not guaranteed.
/// Additionally, this function does not resolve trait objects. This means that
/// `type_name_of_val(&7u32 as &dyn Debug)` may return `"dyn Debug"`, but wil not return `"u32"`
/// at this time.
///
/// # Examples
///
/// Prints the default integer and float types.
///
/// ```rust
/// #![feature(type_name_of_val)]
/// use std::any::type_name_of_val;
///
/// let x = 1;
/// println!("{}", type_name_of_val(&x));
/// let y = 1.0;
/// println!("{}", type_name_of_val(&y));
/// let s = "foo";
/// let x: i32 = 1;
/// let y: f32 = 1.0;
///
/// assert!(type_name_of_val(&s).contains("str"));
/// assert!(type_name_of_val(&x).contains("i32"));
/// assert!(type_name_of_val(&y).contains("f32"));
/// ```
#[must_use]
#[unstable(feature = "type_name_of_val", issue = "66359")]
#[stable(feature = "type_name_of_val", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_type_name", issue = "63084")]
pub const fn type_name_of_val<T: ?Sized>(_val: &T) -> &'static str {
type_name::<T>()
Expand Down
1 change: 0 additions & 1 deletion tests/ui/hygiene/cross-crate-define-and-use.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
// check-pass
// aux-build:use_by_macro.rs

#![feature(type_name_of_val)]
extern crate use_by_macro;

use use_by_macro::*;
Expand Down

0 comments on commit de3848f

Please sign in to comment.