Skip to content

Commit

Permalink
Remove fn ptr comparison from Any cast
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Dec 25, 2021
1 parent 8e458c5 commit a2c8437
Showing 1 changed file with 2 additions and 15 deletions.
17 changes: 2 additions & 15 deletions src/any.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,35 +154,22 @@ impl<T> MaybeUninit<T> {
struct Fingerprint {
size: usize,
align: usize,
id: usize,
}

impl Fingerprint {
fn of<T>() -> Fingerprint {
Fingerprint {
size: mem::size_of::<T>(),
align: mem::align_of::<T>(),
// This is not foolproof -- theoretically Rust or LLVM could
// deduplicate some or all of these methods. But in practice it's
// great and I am comfortable relying on this in debug mode to catch
// bugs early.
id: Fingerprint::of::<T> as usize,
}
}
}

#[cfg(not(miri))]
#[test]
fn test_fingerprint() {
assert_eq!(Fingerprint::of::<usize>(), Fingerprint::of::<usize>());
assert_eq!(Fingerprint::of::<&str>(), Fingerprint::of::<&'static str>());

assert_ne!(Fingerprint::of::<usize>(), Fingerprint::of::<isize>());
assert_ne!(Fingerprint::of::<usize>(), Fingerprint::of::<&usize>());
assert_ne!(Fingerprint::of::<&usize>(), Fingerprint::of::<&&usize>());
assert_ne!(Fingerprint::of::<&usize>(), Fingerprint::of::<&mut usize>());

struct A;
struct B;
assert_ne!(Fingerprint::of::<A>(), Fingerprint::of::<B>());
assert_ne!(Fingerprint::of::<u32>(), Fingerprint::of::<[u8; 4]>());
assert_ne!(Fingerprint::of::<u32>(), Fingerprint::of::<[u32; 2]>());
}

0 comments on commit a2c8437

Please sign in to comment.