mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-02 14:07:10 +00:00
Stabilize `duration_checked_float` ## Stabilization Report This stabilization report is for a stabilization of `duration_checked_float`, tracking issue: https://github.com/rust-lang/rust/issues/83400. ### Implementation History - https://github.com/rust-lang/rust/pull/82179 - https://github.com/rust-lang/rust/pull/90247 - https://github.com/rust-lang/rust/pull/96051 - Changed error type to `FromFloatSecsError` in https://github.com/rust-lang/rust/pull/90247 - https://github.com/rust-lang/rust/pull/96051 changes the rounding mode to round-to-nearest instead of truncate. ## API Summary This stabilization report proposes the following API to be stabilized in `core`, along with their re-exports in `std`: ```rust // core::time impl Duration { pub const fn try_from_secs_f32(secs: f32) -> Result<Duration, TryFromFloatSecsError>; pub const fn try_from_secs_f64(secs: f64) -> Result<Duration, TryFromFloatSecsError>; } #[derive(Debug, Clone, PartialEq, Eq)] pub struct TryFromFloatSecsError { ... } impl core::fmt::Display for TryFromFloatSecsError { ... } impl core::error::Error for TryFromFloatSecsError { ... } ``` These functions are made const unstable under `duration_consts_float`, tracking issue #72440. There is an open question in the tracking issue around what the error type should be called which I was hoping to resolve in the context of an FCP. In this stabilization PR, I have altered the name of the error type to `TryFromFloatSecsError`. In my opinion, the error type shares the name of the method (adjusted to accommodate both types of floats), which is consistent with other error types in `core`, `alloc` and `std` like `TryReserveError` and `TryFromIntError`. ## Experience Report Code such as this is ready to be converted to a checked API to ensure it is panic free: ```rust impl Time { pub fn checked_add_f64(&self, seconds: f64) -> Result<Self, TimeError> { // Fail safely during `f64` conversion to duration if seconds.is_nan() || seconds.is_infinite() { return Err(TzOutOfRangeError::new().into()); } if seconds.is_sign_positive() { self.checked_add(Duration::from_secs_f64(seconds)) } else { self.checked_sub(Duration::from_secs_f64(-seconds)) } } } ``` See: https://github.com/artichoke/artichoke/issues/2194. `@rustbot` label +T-libs-api -T-libs cc `@mbartlett21`
151 lines
3.5 KiB
Rust
151 lines
3.5 KiB
Rust
#![feature(alloc_layout_extra)]
|
|
#![feature(array_chunks)]
|
|
#![feature(array_methods)]
|
|
#![feature(array_windows)]
|
|
#![feature(bigint_helper_methods)]
|
|
#![feature(cell_update)]
|
|
#![feature(const_assume)]
|
|
#![feature(const_black_box)]
|
|
#![feature(const_bool_to_option)]
|
|
#![feature(const_caller_location)]
|
|
#![feature(const_cell_into_inner)]
|
|
#![feature(const_convert)]
|
|
#![feature(const_heap)]
|
|
#![feature(const_maybe_uninit_as_mut_ptr)]
|
|
#![feature(const_maybe_uninit_assume_init_read)]
|
|
#![feature(const_nonnull_new)]
|
|
#![feature(const_num_from_num)]
|
|
#![feature(const_pointer_byte_offsets)]
|
|
#![feature(const_ptr_as_ref)]
|
|
#![feature(const_ptr_read)]
|
|
#![feature(const_ptr_write)]
|
|
#![feature(const_trait_impl)]
|
|
#![feature(const_likely)]
|
|
#![feature(const_location_fields)]
|
|
#![feature(core_intrinsics)]
|
|
#![feature(core_private_bignum)]
|
|
#![feature(core_private_diy_float)]
|
|
#![feature(dec2flt)]
|
|
#![feature(div_duration)]
|
|
#![feature(duration_consts_float)]
|
|
#![feature(duration_constants)]
|
|
#![feature(exact_size_is_empty)]
|
|
#![feature(extern_types)]
|
|
#![feature(flt2dec)]
|
|
#![feature(fmt_internals)]
|
|
#![feature(float_minimum_maximum)]
|
|
#![feature(future_join)]
|
|
#![feature(generic_assert_internals)]
|
|
#![feature(array_try_from_fn)]
|
|
#![feature(hasher_prefixfree_extras)]
|
|
#![feature(hashmap_internals)]
|
|
#![feature(try_find)]
|
|
#![feature(inline_const)]
|
|
#![feature(is_sorted)]
|
|
#![feature(pattern)]
|
|
#![feature(pin_macro)]
|
|
#![feature(sort_internals)]
|
|
#![feature(slice_take)]
|
|
#![feature(slice_from_ptr_range)]
|
|
#![feature(split_as_slice)]
|
|
#![feature(maybe_uninit_uninit_array)]
|
|
#![feature(maybe_uninit_write_slice)]
|
|
#![feature(maybe_uninit_uninit_array_transpose)]
|
|
#![feature(min_specialization)]
|
|
#![feature(numfmt)]
|
|
#![feature(step_trait)]
|
|
#![feature(str_internals)]
|
|
#![feature(std_internals)]
|
|
#![feature(test)]
|
|
#![feature(trusted_len)]
|
|
#![feature(try_blocks)]
|
|
#![feature(try_trait_v2)]
|
|
#![feature(slice_internals)]
|
|
#![feature(slice_partition_dedup)]
|
|
#![feature(int_log)]
|
|
#![feature(iter_advance_by)]
|
|
#![feature(iter_array_chunks)]
|
|
#![feature(iter_collect_into)]
|
|
#![feature(iter_partition_in_place)]
|
|
#![feature(iter_intersperse)]
|
|
#![feature(iter_is_partitioned)]
|
|
#![feature(iter_next_chunk)]
|
|
#![feature(iter_order_by)]
|
|
#![feature(iterator_try_collect)]
|
|
#![feature(iterator_try_reduce)]
|
|
#![feature(const_mut_refs)]
|
|
#![feature(const_pin)]
|
|
#![feature(const_waker)]
|
|
#![feature(never_type)]
|
|
#![feature(unwrap_infallible)]
|
|
#![feature(pointer_byte_offsets)]
|
|
#![feature(portable_simd)]
|
|
#![feature(ptr_metadata)]
|
|
#![feature(once_cell)]
|
|
#![feature(option_result_contains)]
|
|
#![feature(unsized_tuple_coercion)]
|
|
#![feature(const_option)]
|
|
#![feature(const_option_ext)]
|
|
#![feature(const_result)]
|
|
#![feature(integer_atomics)]
|
|
#![feature(int_roundings)]
|
|
#![feature(slice_group_by)]
|
|
#![feature(split_array)]
|
|
#![feature(strict_provenance)]
|
|
#![feature(strict_provenance_atomic_ptr)]
|
|
#![feature(trusted_random_access)]
|
|
#![feature(unsize)]
|
|
#![feature(unzip_option)]
|
|
#![feature(const_array_from_ref)]
|
|
#![feature(const_slice_from_ref)]
|
|
#![feature(waker_getters)]
|
|
#![feature(slice_flatten)]
|
|
#![feature(provide_any)]
|
|
#![feature(utf8_chunks)]
|
|
#![feature(is_ascii_octdigit)]
|
|
#![deny(unsafe_op_in_unsafe_fn)]
|
|
|
|
extern crate test;
|
|
|
|
mod alloc;
|
|
mod any;
|
|
mod array;
|
|
mod ascii;
|
|
mod asserting;
|
|
mod atomic;
|
|
mod bool;
|
|
mod cell;
|
|
mod char;
|
|
mod clone;
|
|
mod cmp;
|
|
mod const_ptr;
|
|
mod convert;
|
|
mod fmt;
|
|
mod future;
|
|
mod hash;
|
|
mod intrinsics;
|
|
mod iter;
|
|
mod lazy;
|
|
mod macros;
|
|
mod manually_drop;
|
|
mod mem;
|
|
mod nonzero;
|
|
mod num;
|
|
mod ops;
|
|
mod option;
|
|
mod panic;
|
|
mod pattern;
|
|
mod pin;
|
|
mod pin_macro;
|
|
mod ptr;
|
|
mod result;
|
|
mod simd;
|
|
mod slice;
|
|
mod str;
|
|
mod str_lossy;
|
|
mod task;
|
|
mod time;
|
|
mod tuple;
|
|
mod unicode;
|
|
mod waker;
|