|
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