diff options
| author | Ralf Jung <post@ralfj.de> | 2019-10-22 18:06:30 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2019-10-22 18:08:21 +0200 |
| commit | fe84809394fbc6ad2d36f6f142671bea7a492a4c (patch) | |
| tree | 20c80b72ffb3e5c8e6ffe04f4a66323819759f01 | |
| parent | 6576f4be5af31a5e61dfc0cf50b7130e6c6dfb35 (diff) | |
| download | rust-fe84809394fbc6ad2d36f6f142671bea7a492a4c.tar.gz rust-fe84809394fbc6ad2d36f6f142671bea7a492a4c.zip | |
relax ExactSizeIterator bound on write_bytes: too many iterators don't have that bound
| -rw-r--r-- | src/librustc/mir/interpret/allocation.rs | 7 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/memory.rs | 7 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/librustc/mir/interpret/allocation.rs b/src/librustc/mir/interpret/allocation.rs index 796d293e2c6..aa8ac4902a8 100644 --- a/src/librustc/mir/interpret/allocation.rs +++ b/src/librustc/mir/interpret/allocation.rs @@ -353,11 +353,14 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra<Tag>> Allocation<Tag, Extra> { &mut self, cx: &impl HasDataLayout, ptr: Pointer<Tag>, - src: impl IntoIterator<Item=u8, IntoIter: iter::ExactSizeIterator>, + src: impl IntoIterator<Item=u8>, ) -> InterpResult<'tcx> { let mut src = src.into_iter(); - let bytes = self.get_bytes_mut(cx, ptr, Size::from_bytes(src.len() as u64))?; + let (lower, upper) = src.size_hint(); + let len = upper.expect("can only write bounded iterators"); + assert_eq!(lower, len, "can only write iterators with a precise length"); + let bytes = self.get_bytes_mut(cx, ptr, Size::from_bytes(len as u64))?; // `zip` would stop when the first iterator ends; we want to definitely // cover all of `bytes`. for dest in bytes { diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index eef1868ec65..d113ee33162 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -7,7 +7,7 @@ //! short-circuiting the empty case! use std::collections::VecDeque; -use std::{ptr, iter}; +use std::ptr; use std::borrow::Cow; use rustc::ty::{self, Instance, ParamEnv, query::TyCtxtAt}; @@ -791,11 +791,12 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { pub fn write_bytes( &mut self, ptr: Scalar<M::PointerTag>, - src: impl IntoIterator<Item=u8, IntoIter: iter::ExactSizeIterator>, + src: impl IntoIterator<Item=u8>, ) -> InterpResult<'tcx> { let src = src.into_iter(); - let size = Size::from_bytes(src.len() as u64); + let size = Size::from_bytes(src.size_hint().0 as u64); + // `write_bytes` checks that this lower bound matches the upper bound matches reality. let ptr = match self.check_ptr_access(ptr, size, Align::from_bytes(1).unwrap())? { Some(ptr) => ptr, None => return Ok(()), // zero-sized access |
