// Check that we aren't using unsound specialization in slice comparisons. // run-pass use std::cell::Cell; use std::cmp::Ordering; struct Evil<'a, 'b>(Cell<(&'a [i32], &'b [i32])>); impl PartialEq for Evil<'_, '_> { fn eq(&self, _other: &Self) -> bool { true } } impl Eq for Evil<'_, '_> {} impl PartialOrd for Evil<'_, '_> { fn partial_cmp(&self, _other: &Self) -> Option { Some(Ordering::Equal) } } impl<'a> Ord for Evil<'a, 'a> { fn cmp(&self, _other: &Self) -> Ordering { let (a, b) = self.0.get(); self.0.set((b, a)); Ordering::Equal } } fn main() { let x = &[1, 2, 3, 4]; let u = { let a = Box::new([7, 8, 9, 10]); let y = [Evil(Cell::new((x, &*a)))]; let _ = &y[..] <= &y[..]; let [Evil(c)] = y; c.get().0 }; assert_eq!(u, &[1, 2, 3, 4]); }