Skip to content

Commit 3bfce83

Browse files
authored
Rollup merge of #138370 - cuviper:try_oom_error, r=jhpratt
Simulate OOM for the `try_oom_error` test We can create the expected error manually, rather than trying to produce a real one, so the error conversion test can run on all targets. Before, it was only running on 64-bit and not miri. In Fedora, we also found that s390x was not getting the expected error, "successfully" allocating the huge size because it was optimizing the real `malloc` call away. It's possible to counter that by looking at the pointer in any way, like a debug print, but it's more robust to just deal with errors directly, since this test is only about conversion. Related: #133806
2 parents 1827ffd + 53f488a commit 3bfce83

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

library/std/src/io/tests.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -811,13 +811,17 @@ fn read_to_end_error() {
811811
}
812812

813813
#[test]
814-
// Miri does not support signalling OOM
815-
#[cfg_attr(miri, ignore)]
816-
// 64-bit only to be sure the allocator will fail fast on an impossible to satisfy size
817-
#[cfg(target_pointer_width = "64")]
818814
fn try_oom_error() {
819-
let mut v = Vec::<u8>::new();
820-
let reserve_err = v.try_reserve(isize::MAX as usize - 1).unwrap_err();
815+
use alloc::alloc::Layout;
816+
use alloc::collections::{TryReserveError, TryReserveErrorKind};
817+
818+
// We simulate a `Vec::try_reserve` error rather than attempting a huge size for real. This way
819+
// we're not subject to the whims of optimization that might skip the actual allocation, and it
820+
// also works for 32-bit targets and miri that might not OOM at all.
821+
let layout = Layout::new::<u8>();
822+
let kind = TryReserveErrorKind::AllocError { layout, non_exhaustive: () };
823+
let reserve_err = TryReserveError::from(kind);
824+
821825
let io_err = io::Error::from(reserve_err);
822826
assert_eq!(io::ErrorKind::OutOfMemory, io_err.kind());
823827
}

0 commit comments

Comments
 (0)