Fix two const-hacks

This commit is contained in:
George Bateman 2024-10-14 20:47:24 +01:00
parent 17a19e684c
commit 4e438f7d6b
No known key found for this signature in database
GPG Key ID: C417AA9C4039EFCF
2 changed files with 7 additions and 20 deletions

View File

@ -213,11 +213,9 @@ pub const fn new(secs: u64, nanos: u32) -> Duration {
// SAFETY: nanos < NANOS_PER_SEC, therefore nanos is within the valid range // SAFETY: nanos < NANOS_PER_SEC, therefore nanos is within the valid range
Duration { secs, nanos: unsafe { Nanoseconds(nanos) } } Duration { secs, nanos: unsafe { Nanoseconds(nanos) } }
} else { } else {
// FIXME(const-hack): use `.expect` once that is possible. let secs = secs
let secs = match secs.checked_add((nanos / NANOS_PER_SEC) as u64) { .checked_add((nanos / NANOS_PER_SEC) as u64)
Some(secs) => secs, .expect("overflow in Duration::new");
None => panic!("overflow in Duration::new"),
};
let nanos = nanos % NANOS_PER_SEC; let nanos = nanos % NANOS_PER_SEC;
// SAFETY: nanos % NANOS_PER_SEC < NANOS_PER_SEC, therefore nanos is within the valid range // SAFETY: nanos % NANOS_PER_SEC < NANOS_PER_SEC, therefore nanos is within the valid range
Duration { secs, nanos: unsafe { Nanoseconds(nanos) } } Duration { secs, nanos: unsafe { Nanoseconds(nanos) } }

View File

@ -18,17 +18,6 @@
use crate::sys_common::wstr::WStrUnits; use crate::sys_common::wstr::WStrUnits;
use crate::{fmt, io, iter, vec}; use crate::{fmt, io, iter, vec};
/// This is the const equivalent to `NonZero::new(n).unwrap()`
///
/// FIXME(const-hack): This can be removed once `Option::unwrap` is stably const.
/// See the `const_option` feature (#67441).
const fn non_zero_u16(n: u16) -> NonZero<u16> {
match NonZero::new(n) {
Some(n) => n,
None => panic!("called `unwrap` on a `None` value"),
}
}
pub fn args() -> Args { pub fn args() -> Args {
// SAFETY: `GetCommandLineW` returns a pointer to a null terminated UTF-16 // SAFETY: `GetCommandLineW` returns a pointer to a null terminated UTF-16
// string so it's safe for `WStrUnits` to use. // string so it's safe for `WStrUnits` to use.
@ -66,10 +55,10 @@ fn parse_lp_cmd_line<'a, F: Fn() -> OsString>(
lp_cmd_line: Option<WStrUnits<'a>>, lp_cmd_line: Option<WStrUnits<'a>>,
exe_name: F, exe_name: F,
) -> Vec<OsString> { ) -> Vec<OsString> {
const BACKSLASH: NonZero<u16> = non_zero_u16(b'\\' as u16); const BACKSLASH: NonZero<u16> = NonZero::new(b'\\' as u16).unwrap();
const QUOTE: NonZero<u16> = non_zero_u16(b'"' as u16); const QUOTE: NonZero<u16> = NonZero::new(b'"' as u16).unwrap();
const TAB: NonZero<u16> = non_zero_u16(b'\t' as u16); const TAB: NonZero<u16> = NonZero::new(b'\t' as u16).unwrap();
const SPACE: NonZero<u16> = non_zero_u16(b' ' as u16); const SPACE: NonZero<u16> = NonZero::new(b' ' as u16).unwrap();
let mut ret_val = Vec::new(); let mut ret_val = Vec::new();
// If the cmd line pointer is null or it points to an empty string then // If the cmd line pointer is null or it points to an empty string then