static tycat_int: int = 3;
static tycat_float: int = 4;
static tycat_bot: int = 5;
+ static tycat_raw_ptr: int = 6;
static opcat_add: int = 0;
static opcat_sub: int = 1;
ty_int(_) | ty_uint(_) | ty_infer(IntVar(_)) => tycat_int,
ty_float(_) | ty_infer(FloatVar(_)) => tycat_float,
ty_bot => tycat_bot,
+ ty_ptr(_) => tycat_raw_ptr,
_ => tycat_other
}
}
/*char*/ [f, f, f, f, t, t, f, f],
/*int*/ [t, t, t, t, t, t, t, f],
/*float*/ [t, t, t, f, t, t, f, f],
- /*bot*/ [t, t, t, t, f, f, t, t]];
+ /*bot*/ [t, t, t, t, f, f, t, t],
+ /*raw ptr*/ [f, f, f, f, t, t, f, f]];
return tbl[tycat(cx, ty)][opcat(op)];
}
}
// Equality for pointers
-#[cfg(not(test))]
+#[cfg(stage0, not(test))]
impl<T> Eq for *T {
#[inline]
fn eq(&self, other: &*T) -> bool {
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 {
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 {
}
// Comparison for pointers
-#[cfg(not(test))]
+#[cfg(stage0, not(test))]
impl<T> Ord for *T {
#[inline]
fn lt(&self, other: &*T) -> bool {
}
}
-#[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 {
}
}
+#[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::*;