diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index a7c5d29c5a51..748d63362463 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -450,11 +450,14 @@ pub fn swap(x: &mut T, y: &mut T) { let x = x as *mut T as *mut u8; let y = y as *mut T as *mut u8; - // use an xor-swap as x & y are guaranteed to never alias - for i in 0..size_of::() as isize { + // can't use a for loop as the `range` impl calls `mem::swap` recursively + let mut i = 0; + while i < size_of::() as isize { + // use an xor-swap as x & y are guaranteed to never alias *x.offset(i) ^= *y.offset(i); *y.offset(i) ^= *x.offset(i); *x.offset(i) ^= *y.offset(i); + i += 1; } } }