diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs
index d2de0d46d746b..58222496e7249 100644
--- a/src/libcore/iter/mod.rs
+++ b/src/libcore/iter/mod.rs
@@ -626,7 +626,9 @@ impl DoubleEndedIterator for Chain where
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")]
@@ -668,17 +670,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
@@ -689,7 +680,8 @@ impl ZipImpl for Zip
Zip {
a: a,
b: b,
- spec: Default::default(), // unused
+ index: 0, // unused
+ len: 0, // unused
}
}
@@ -742,20 +734,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
@@ -765,18 +743,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)))
}
@@ -787,7 +763,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))
}
@@ -796,9 +772,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/librustc_driver/lib.rs b/src/librustc_driver/lib.rs
index 6f57ae2941838..f9a5331926424 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -1049,7 +1049,8 @@ fn parse_crate_attrs<'a>(sess: &'a Session, input: &Input) -> PResult<'a, Vec(f: F) {
- const STACK_SIZE: usize = 8 * 1024 * 1024; // 8MB
+ // Temporarily have stack size set to 16MB to deal with nom-using crates failing
+ const STACK_SIZE: usize = 16 * 1024 * 1024; // 16MB
struct Sink(Arc>>);
impl Write for Sink {
diff --git a/src/llvm b/src/llvm
index eee68eafa7e8e..7801978ec1f36 160000
--- a/src/llvm
+++ b/src/llvm
@@ -1 +1 @@
-Subproject commit eee68eafa7e8e4ce996b49f5551636639a6c331a
+Subproject commit 7801978ec1f3637fcda1b564048ebc732bf586af
diff --git a/src/rustllvm/llvm-auto-clean-trigger b/src/rustllvm/llvm-auto-clean-trigger
index 67f8730c25825..ea8d59290df2e 100644
--- a/src/rustllvm/llvm-auto-clean-trigger
+++ b/src/rustllvm/llvm-auto-clean-trigger
@@ -1,4 +1,4 @@
# If this file is modified, then llvm will be forcibly cleaned and then rebuilt.
# The actual contents of this file do not matter, but to trigger a change on the
# build bots then the contents should be changed so git updates the mtime.
-2016-08-23
+2016-09-17
diff --git a/src/test/run-pass/issue-36474.rs b/src/test/run-pass/issue-36474.rs
new file mode 100644
index 0000000000000..025244ca6648c
--- /dev/null
+++ b/src/test/run-pass/issue-36474.rs
@@ -0,0 +1,40 @@
+// Copyright 2016 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.
+
+fn main() {
+ remove_axis(&3, 0);
+}
+
+trait Dimension {
+ fn slice(&self) -> &[usize];
+}
+
+impl Dimension for () {
+ fn slice(&self) -> &[usize] { &[] }
+}
+
+impl Dimension for usize {
+ fn slice(&self) -> &[usize] {
+ unsafe {
+ ::std::slice::from_raw_parts(self, 1)
+ }
+ }
+}
+
+fn remove_axis(value: &usize, axis: usize) -> () {
+ let tup = ();
+ let mut it = tup.slice().iter();
+ for (i, _) in value.slice().iter().enumerate() {
+ if i == axis {
+ continue;
+ }
+ it.next();
+ }
+}
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() { }