implement raw pointer comparisons in librustc
This is mostly for consistency, as you can now compare raw pointers in constant expressions or without the standard library. It also reduces the number of `ptrtoint` instructions in the IR, making tracking down culprits of what's usually an anti-pattern easier.
This commit is contained in:
@@ -383,7 +383,7 @@ impl<T> RawPtr<T> for *mut T {
|
||||
}
|
||||
|
||||
// Equality for pointers
|
||||
#[cfg(not(test))]
|
||||
#[cfg(stage0, not(test))]
|
||||
impl<T> Eq for *T {
|
||||
#[inline]
|
||||
fn eq(&self, other: &*T) -> bool {
|
||||
@@ -393,7 +393,17 @@ impl<T> Eq for *T {
|
||||
fn ne(&self, other: &*T) -> bool { !self.eq(other) }
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[cfg(not(stage0), not(test))]
|
||||
impl<T> Eq for *T {
|
||||
#[inline]
|
||||
fn eq(&self, other: &*T) -> bool {
|
||||
*self == *other
|
||||
}
|
||||
#[inline]
|
||||
fn ne(&self, other: &*T) -> bool { !self.eq(other) }
|
||||
}
|
||||
|
||||
#[cfg(stage0, not(test))]
|
||||
impl<T> Eq for *mut T {
|
||||
#[inline]
|
||||
fn eq(&self, other: &*mut T) -> bool {
|
||||
@@ -403,6 +413,16 @@ impl<T> Eq for *mut T {
|
||||
fn ne(&self, other: &*mut T) -> bool { !self.eq(other) }
|
||||
}
|
||||
|
||||
#[cfg(not(stage0), not(test))]
|
||||
impl<T> Eq for *mut T {
|
||||
#[inline]
|
||||
fn eq(&self, other: &*mut T) -> bool {
|
||||
*self == *other
|
||||
}
|
||||
#[inline]
|
||||
fn ne(&self, other: &*mut T) -> bool { !self.eq(other) }
|
||||
}
|
||||
|
||||
// Equivalence for pointers
|
||||
#[cfg(not(test))]
|
||||
impl<T> Equiv<*mut T> for *T {
|
||||
@@ -460,7 +480,7 @@ mod externfnpointers {
|
||||
}
|
||||
|
||||
// Comparison for pointers
|
||||
#[cfg(not(test))]
|
||||
#[cfg(stage0, not(test))]
|
||||
impl<T> Ord for *T {
|
||||
#[inline]
|
||||
fn lt(&self, other: &*T) -> bool {
|
||||
@@ -480,7 +500,27 @@ impl<T> Ord for *T {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[cfg(not(stage0), not(test))]
|
||||
impl<T> Ord for *T {
|
||||
#[inline]
|
||||
fn lt(&self, other: &*T) -> bool {
|
||||
*self < *other
|
||||
}
|
||||
#[inline]
|
||||
fn le(&self, other: &*T) -> bool {
|
||||
*self <= *other
|
||||
}
|
||||
#[inline]
|
||||
fn ge(&self, other: &*T) -> bool {
|
||||
*self >= *other
|
||||
}
|
||||
#[inline]
|
||||
fn gt(&self, other: &*T) -> bool {
|
||||
*self > *other
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(stage0, not(test))]
|
||||
impl<T> Ord for *mut T {
|
||||
#[inline]
|
||||
fn lt(&self, other: &*mut T) -> bool {
|
||||
@@ -500,6 +540,26 @@ impl<T> Ord for *mut T {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(stage0), not(test))]
|
||||
impl<T> Ord for *mut T {
|
||||
#[inline]
|
||||
fn lt(&self, other: &*mut T) -> bool {
|
||||
*self < *other
|
||||
}
|
||||
#[inline]
|
||||
fn le(&self, other: &*mut T) -> bool {
|
||||
*self <= *other
|
||||
}
|
||||
#[inline]
|
||||
fn ge(&self, other: &*mut T) -> bool {
|
||||
*self >= *other
|
||||
}
|
||||
#[inline]
|
||||
fn gt(&self, other: &*mut T) -> bool {
|
||||
*self > *other
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub mod ptr_tests {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user