mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
Manually order DefId
on 64-bit big-endian
`DefId` uses different field orders on 64-bit big-endian vs. others, in order to optimize its `Hash` implementation. However, that also made it derive different lexical ordering for `PartialOrd` and `Ord`. That caused spurious differences wherever `DefId`s are sorted, like the candidate sources list in `report_method_error`. Now we manually implement `PartialOrd` and `Ord` on 64-bit big-endian to match the same lexical ordering as other targets, fixing at least one test, `src/test/ui/methods/method-ambig-two-traits-cross-crate.rs`.
This commit is contained in:
parent
57ee5cf5a9
commit
fb5002d68a
@ -218,7 +218,9 @@ impl<D: Decoder> Decodable<D> for DefIndex {
|
|||||||
/// index and a def index.
|
/// index and a def index.
|
||||||
///
|
///
|
||||||
/// You can create a `DefId` from a `LocalDefId` using `local_def_id.to_def_id()`.
|
/// You can create a `DefId` from a `LocalDefId` using `local_def_id.to_def_id()`.
|
||||||
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Copy)]
|
#[derive(Clone, PartialEq, Eq, Copy)]
|
||||||
|
// Don't derive order on 64-bit big-endian, so we can be consistent regardless of field order.
|
||||||
|
#[cfg_attr(not(all(target_pointer_width = "64", target_endian = "big")), derive(PartialOrd, Ord))]
|
||||||
// On below-64 bit systems we can simply use the derived `Hash` impl
|
// On below-64 bit systems we can simply use the derived `Hash` impl
|
||||||
#[cfg_attr(not(target_pointer_width = "64"), derive(Hash))]
|
#[cfg_attr(not(target_pointer_width = "64"), derive(Hash))]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@ -260,6 +262,22 @@ impl Hash for DefId {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implement the same comparison as derived with the other field order.
|
||||||
|
#[cfg(all(target_pointer_width = "64", target_endian = "big"))]
|
||||||
|
impl Ord for DefId {
|
||||||
|
#[inline]
|
||||||
|
fn cmp(&self, other: &DefId) -> std::cmp::Ordering {
|
||||||
|
Ord::cmp(&(self.index, self.krate), &(other.index, other.krate))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(all(target_pointer_width = "64", target_endian = "big"))]
|
||||||
|
impl PartialOrd for DefId {
|
||||||
|
#[inline]
|
||||||
|
fn partial_cmp(&self, other: &DefId) -> Option<std::cmp::Ordering> {
|
||||||
|
Some(Ord::cmp(self, other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl DefId {
|
impl DefId {
|
||||||
/// Makes a local `DefId` from the given `DefIndex`.
|
/// Makes a local `DefId` from the given `DefIndex`.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
Loading…
Reference in New Issue
Block a user