From 3322595e896e95c3e19ca33c854ad529f2ef3c19 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Mon, 1 Apr 2013 22:32:37 -0700 Subject: Reason about nested free variables that appear in a function signature. In a nutshell, the idea is to (1) report an error if, for a region pointer `'a T`, the lifetime `'a` is longer than any lifetimes that appear in `T` (in other words, if a borrowed pointer outlives any portion of its contents) and then (2) use this to assume that in a function like `fn(self: &'a &'b T)`, the relationship `'a <= 'b` holds. This is needed for #5656. Fixes #5728. --- src/libcore/cmp.rs | 21 +++++++++++++++++++++ src/libcore/str.rs | 6 +++++- src/libcore/tuple.rs | 1 - 3 files changed, 26 insertions(+), 2 deletions(-) (limited to 'src/libcore') diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index f96575aaf41..bd4832b6faf 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -116,6 +116,19 @@ totalord_impl!(i64) totalord_impl!(int) totalord_impl!(uint) +pub fn cmp2( + a1: &A, b1: &B, + a2: &A, b2: &B) -> Ordering +{ + //! Compares (a1, b1) against (a2, b2), where the a values are more significant. + + match a1.cmp(a2) { + Less => Less, + Greater => Greater, + Equal => b1.cmp(b2) + } +} + /** * Trait for values that can be compared for a sort-order. * @@ -193,6 +206,14 @@ mod test { assert_eq!(12.cmp(-5), Greater); } + #[test] + fn test_cmp2() { + assert_eq!(cmp2(1, 2, 3, 4), Less); + assert_eq!(cmp2(3, 2, 3, 4), Less); + assert_eq!(cmp2(5, 2, 3, 4), Greater); + assert_eq!(cmp2(5, 5, 5, 4), Greater); + } + #[test] fn test_int_totaleq() { assert!(5.equals(&5)); diff --git a/src/libcore/str.rs b/src/libcore/str.rs index f1605309fb4..8d15d6afbda 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -301,7 +301,11 @@ pub fn slice_shift_char<'a>(s: &'a str) -> (char, &'a str) { /// Prepend a char to a string pub fn unshift_char(s: &mut ~str, ch: char) { - *s = from_char(ch) + *s; + // This could be more efficient. + let mut new_str = ~""; + new_str.push_char(ch); + new_str.push_str(*s); + *s = new_str; } /** diff --git a/src/libcore/tuple.rs b/src/libcore/tuple.rs index 35b8496f6c5..8234129e254 100644 --- a/src/libcore/tuple.rs +++ b/src/libcore/tuple.rs @@ -161,7 +161,6 @@ impl Ord for (A,) { fn gt(&self, other: &(A,)) -> bool { other.lt(&(*self)) } } - #[cfg(notest)] impl Eq for (A, B) { #[inline(always)] -- cgit 1.4.1-3-g733a5