|  | 
| 6 | 6 | #![allow(dead_code)] | 
| 7 | 7 | 
 | 
| 8 | 8 | use std::any::type_name; | 
|  | 9 | +use std::borrow::Cow; | 
| 9 | 10 | 
 | 
| 10 |  | -struct Foo<T> { | 
| 11 |  | -    x: T, | 
|  | 11 | +struct Foo<T>(T); | 
|  | 12 | + | 
|  | 13 | +struct Bar<'a>(&'a u32); | 
|  | 14 | + | 
|  | 15 | +struct Baz<'a, T>(&'a T); | 
|  | 16 | + | 
|  | 17 | +trait TrL<'a> {} | 
|  | 18 | +trait TrLA<'a> { | 
|  | 19 | +    type A; | 
|  | 20 | +} | 
|  | 21 | +trait TrLT<'a, T> {} | 
|  | 22 | +trait TrLTA<'a, T> { | 
|  | 23 | +    type A; | 
|  | 24 | +} | 
|  | 25 | + | 
|  | 26 | +macro_rules! t { | 
|  | 27 | +    ($ty:ty, $str:literal) => { | 
|  | 28 | +        assert_eq!(type_name::<$ty>(), $str); | 
|  | 29 | +    } | 
| 12 | 30 | } | 
| 13 | 31 | 
 | 
| 14 | 32 | pub fn main() { | 
| 15 |  | -    assert_eq!(type_name::<isize>(), "isize"); | 
| 16 |  | -    assert_eq!(type_name::<Foo<usize>>(), "type_name_basic::Foo<usize>"); | 
|  | 33 | +    t!(bool, "bool"); | 
|  | 34 | +    t!(char, "char"); | 
|  | 35 | + | 
|  | 36 | +    t!(u8, "u8"); | 
|  | 37 | +    t!(u16, "u16"); | 
|  | 38 | +    t!(u32, "u32"); | 
|  | 39 | +    t!(u64, "u64"); | 
|  | 40 | +    t!(u128, "u128"); | 
|  | 41 | +    t!(usize, "usize"); | 
|  | 42 | + | 
|  | 43 | +    t!(i8, "i8"); | 
|  | 44 | +    t!(i16, "i16"); | 
|  | 45 | +    t!(i32, "i32"); | 
|  | 46 | +    t!(i64, "i64"); | 
|  | 47 | +    t!(i128, "i128"); | 
|  | 48 | +    t!(isize, "isize"); | 
|  | 49 | + | 
|  | 50 | +    t!(String, "alloc::string::String"); | 
|  | 51 | +    t!(str, "str"); | 
|  | 52 | +    t!(&str, "&str"); | 
|  | 53 | +    t!(&'static str, "&str"); | 
|  | 54 | + | 
|  | 55 | +    t!((u16, u32, u64), "(u16, u32, u64)"); | 
|  | 56 | +    t!([usize; 4], "[usize; 4]"); | 
|  | 57 | +    t!([usize], "[usize]"); | 
|  | 58 | +    t!(&[usize], "&[usize]"); | 
|  | 59 | + | 
|  | 60 | +    t!(*const bool, "*const bool"); | 
|  | 61 | +    t!(*mut u64, "*mut u64"); | 
|  | 62 | + | 
|  | 63 | +    t!(Vec<Vec<u32>>, "alloc::vec::Vec<alloc::vec::Vec<u32>>"); | 
|  | 64 | +    t!(Foo<usize>, "type_name_basic::Foo<usize>"); | 
|  | 65 | +    t!(Bar<'static>, "type_name_basic::Bar"); | 
|  | 66 | +    t!(Baz<'static, u32>, "type_name_basic::Baz<u32>"); | 
|  | 67 | + | 
|  | 68 | +    // FIXME: lifetime omission means these all print badly. | 
|  | 69 | +    t!(dyn TrL<'static>, "dyn type_name_basic::TrL<>"); | 
|  | 70 | +    t!(dyn TrLA<'static, A = u32>, "dyn type_name_basic::TrLA<, A = u32>"); | 
|  | 71 | +    t!( | 
|  | 72 | +        dyn TrLT<'static, Cow<'static, ()>>, | 
|  | 73 | +        "dyn type_name_basic::TrLT<, alloc::borrow::Cow<()>>" | 
|  | 74 | +    ); | 
|  | 75 | +    t!( | 
|  | 76 | +        dyn TrLTA<'static, u32, A = Cow<'static, ()>>, | 
|  | 77 | +        "dyn type_name_basic::TrLTA<, u32, A = alloc::borrow::Cow<()>>" | 
|  | 78 | +    ); | 
|  | 79 | + | 
|  | 80 | +    t!(fn(i32) -> i32, "fn(i32) -> i32"); | 
|  | 81 | +    t!(dyn for<'a> Fn(&'a u32), "dyn core::ops::function::Fn(&u32)"); | 
|  | 82 | + | 
|  | 83 | +    struct S<'a, T>(&'a T); | 
|  | 84 | +    impl<'a, T: Clone> S<'a, T> { | 
|  | 85 | +        fn test() { | 
|  | 86 | +            t!(Cow<'a, T>, "alloc::borrow::Cow<u32>"); | 
|  | 87 | +        } | 
|  | 88 | +    } | 
|  | 89 | +    S::<u32>::test(); | 
| 17 | 90 | } | 
0 commit comments