43 lines
888 B
Rust
43 lines
888 B
Rust
|
// 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<Ordering> {
|
||
|
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]);
|
||
|
}
|