diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs
index b1d3ab1d1febc..dd57fd1b5190f 100644
--- a/src/libcore/iter/mod.rs
+++ b/src/libcore/iter/mod.rs
@@ -643,7 +643,9 @@ impl FusedIterator for Chain
pub struct Zip {
a: A,
b: B,
- spec: <(A, B) as ZipImplData>::Data,
+ // index and len are only used by the specialized version of zip
+ index: usize,
+ len: usize,
}
#[stable(feature = "rust1", since = "1.0.0")]
@@ -685,17 +687,6 @@ trait ZipImpl {
B: DoubleEndedIterator + ExactSizeIterator;
}
-// Zip specialization data members
-#[doc(hidden)]
-trait ZipImplData {
- type Data: 'static + Clone + Default + fmt::Debug;
-}
-
-#[doc(hidden)]
-impl ZipImplData for T {
- default type Data = ();
-}
-
// General Zip impl
#[doc(hidden)]
impl ZipImpl for Zip
@@ -706,7 +697,8 @@ impl ZipImpl for Zip
Zip {
a: a,
b: b,
- spec: Default::default(), // unused
+ index: 0, // unused
+ len: 0, // unused
}
}
@@ -759,20 +751,6 @@ impl ZipImpl for Zip
}
}
-#[doc(hidden)]
-#[derive(Default, Debug, Clone)]
-struct ZipImplFields {
- index: usize,
- len: usize,
-}
-
-#[doc(hidden)]
-impl ZipImplData for (A, B)
- where A: TrustedRandomAccess, B: TrustedRandomAccess
-{
- type Data = ZipImplFields;
-}
-
#[doc(hidden)]
impl ZipImpl for Zip
where A: TrustedRandomAccess, B: TrustedRandomAccess
@@ -782,18 +760,16 @@ impl ZipImpl for Zip
Zip {
a: a,
b: b,
- spec: ZipImplFields {
- index: 0,
- len: len,
- }
+ index: 0,
+ len: len,
}
}
#[inline]
fn next(&mut self) -> Option<(A::Item, B::Item)> {
- if self.spec.index < self.spec.len {
- let i = self.spec.index;
- self.spec.index += 1;
+ if self.index < self.len {
+ let i = self.index;
+ self.index += 1;
unsafe {
Some((self.a.get_unchecked(i), self.b.get_unchecked(i)))
}
@@ -804,7 +780,7 @@ impl ZipImpl for Zip
#[inline]
fn size_hint(&self) -> (usize, Option) {
- let len = self.spec.len - self.spec.index;
+ let len = self.len - self.index;
(len, Some(len))
}
@@ -813,9 +789,9 @@ impl ZipImpl for Zip
where A: DoubleEndedIterator + ExactSizeIterator,
B: DoubleEndedIterator + ExactSizeIterator
{
- if self.spec.index < self.spec.len {
- self.spec.len -= 1;
- let i = self.spec.len;
+ if self.index < self.len {
+ self.len -= 1;
+ let i = self.len;
unsafe {
Some((self.a.get_unchecked(i), self.b.get_unchecked(i)))
}
diff --git a/src/test/run-pass/variance-iterators-in-libcore.rs b/src/test/run-pass/variance-iterators-in-libcore.rs
new file mode 100644
index 0000000000000..b9677d5ba8598
--- /dev/null
+++ b/src/test/run-pass/variance-iterators-in-libcore.rs
@@ -0,0 +1,17 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(warnings)]
+
+use std::iter::Zip;
+
+fn zip_covariant<'a, A, B>(iter: Zip<&'static A, &'static B>) -> Zip<&'a A, &'a B> { iter }
+
+fn main() { }