Auto merge of #131724 - matthiaskrgr:rollup-ntgkkk8, r=matthiaskrgr · qinheping/verify-rust-std@76342d9 (original) (raw)

8 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ use core::borrow::Borrow;
7 7 use core::ffi::{CStr, c_char};
8 8 use core::num::NonZero;
9 9 use core::slice::memchr;
10 -use core::str::{self, Utf8Error};
10 +use core::str::{self, FromStr, Utf8Error};
11 11 use core::{fmt, mem, ops, ptr, slice};
12 12
13 13 use crate::borrow::{Cow, ToOwned};
@@ -817,6 +817,30 @@ impl From<Vec<NonZero>> for CString {
817 817 }
818 818 }
819 819
820 +impl FromStr for CString {
821 +type Err = NulError;
822 +
823 +/// Converts a string `s` into a [`CString`].
824 + ///
825 + /// This method is equivalent to [`CString::new`].
826 + #[inline]
827 +fn from_str(s: &str) -> Result<Self, Self::Err> {
828 +Self::new(s)
829 +}
830 +}
831 +
832 +impl TryFrom<CString> for String {
833 +type Error = IntoStringError;
834 +
835 +/// Converts a [`CString`] into a [`String`] if it contains valid UTF-8 data.
836 + ///
837 + /// This method is equivalent to [`CString::into_string`].
838 + #[inline]
839 +fn try_from(value: CString) -> Result<Self, Self::Error> {
840 + value.into_string()
841 +}
842 +}
843 +
820 844 #[cfg(not(test))]
821 845 #[stable(feature = "more_box_slice_clone", since = "1.29.0")]
822 846 impl Clone for Box<CStr> {
Original file line number Diff line number Diff line change
@@ -1282,8 +1282,9 @@ impl char {
1282 1282 ///
1283 1283 /// [`to_ascii_uppercase()`]: #method.to_ascii_uppercase
1284 1284 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
1285 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
1285 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
1286 1286 #[inline]
1287 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
1287 1288 pub const fn make_ascii_uppercase(&mut self) {
1288 1289 *self = self.to_ascii_uppercase();
1289 1290 }
@@ -1308,8 +1309,9 @@ impl char {
1308 1309 ///
1309 1310 /// [`to_ascii_lowercase()`]: #method.to_ascii_lowercase
1310 1311 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
1311 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
1312 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
1312 1313 #[inline]
1314 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
1313 1315 pub const fn make_ascii_lowercase(&mut self) {
1314 1316 *self = self.to_ascii_lowercase();
1315 1317 }
Original file line number Diff line number Diff line change
@@ -125,7 +125,6 @@
125 125 #![feature(const_heap)]
126 126 #![feature(const_index_range_slice_index)]
127 127 #![feature(const_likely)]
128 -#![feature(const_make_ascii)]
129 128 #![feature(const_nonnull_new)]
130 129 #![feature(const_num_midpoint)]
131 130 #![feature(const_option_ext)]
Original file line number Diff line number Diff line change
@@ -624,8 +624,9 @@ impl u8 {
624 624 ///
625 625 /// [`to_ascii_uppercase`]: Self::to_ascii_uppercase
626 626 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
627 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
627 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
628 628 #[inline]
629 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
629 630 pub const fn make_ascii_uppercase(&mut self) {
630 631 *self = self.to_ascii_uppercase();
631 632 }
@@ -650,8 +651,9 @@ impl u8 {
650 651 ///
651 652 /// [`to_ascii_lowercase`]: Self::to_ascii_lowercase
652 653 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
653 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
654 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
654 655 #[inline]
656 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
655 657 pub const fn make_ascii_lowercase(&mut self) {
656 658 *self = self.to_ascii_lowercase();
657 659 }
Original file line number Diff line number Diff line change
@@ -67,8 +67,9 @@ impl [u8] {
67 67 ///
68 68 /// [`to_ascii_uppercase`]: #method.to_ascii_uppercase
69 69 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
70 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
70 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
71 71 #[inline]
72 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
72 73 pub const fn make_ascii_uppercase(&mut self) {
73 74 // FIXME(const-hack): We would like to simply iterate using `for` loops but this isn't currently allowed in constant expressions.
74 75 let mut i = 0;
@@ -89,8 +90,9 @@ impl [u8] {
89 90 ///
90 91 /// [`to_ascii_lowercase`]: #method.to_ascii_lowercase
91 92 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
92 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
93 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
93 94 #[inline]
95 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
94 96 pub const fn make_ascii_lowercase(&mut self) {
95 97 // FIXME(const-hack): We would like to simply iterate using `for` loops but this isn't currently allowed in constant expressions.
96 98 let mut i = 0;
Original file line number Diff line number Diff line change
@@ -2475,8 +2475,9 @@ impl str {
2475 2475 /// assert_eq!("GRüßE, JüRGEN ❤", s);
2476 2476 /// ```
2477 2477 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
2478 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
2478 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
2479 2479 #[inline]
2480 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
2480 2481 pub const fn make_ascii_uppercase(&mut self) {
2481 2482 // SAFETY: changing ASCII letters only does not invalidate UTF-8.
2482 2483 let me = unsafe { self.as_bytes_mut() };
@@ -2503,8 +2504,9 @@ impl str {
2503 2504 /// assert_eq!("grÜße, jÜrgen ❤", s);
2504 2505 /// ```
2505 2506 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
2506 -#[rustc_const_unstable(feature = "const_make_ascii", issue = "130698")]
2507 +#[rustc_const_stable(feature = "const_make_ascii", since = "CURRENT_RUSTC_VERSION")]
2507 2508 #[inline]
2509 +#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
2508 2510 pub const fn make_ascii_lowercase(&mut self) {
2509 2511 // SAFETY: changing ASCII letters only does not invalidate UTF-8.
2510 2512 let me = unsafe { self.as_bytes_mut() };
Original file line number Diff line number Diff line change
@@ -213,11 +213,9 @@ impl Duration {
213 213 // SAFETY: nanos < NANOS_PER_SEC, therefore nanos is within the valid range
214 214 Duration { secs, nanos: unsafe { Nanoseconds(nanos) } }
215 215 } else {
216 -// FIXME(const-hack): use `.expect` once that is possible.
217 -let secs = match secs.checked_add((nanos / NANOS_PER_SEC) as u64) {
218 -Some(secs) => secs,
219 -None => panic!("overflow in Duration::new"),
220 -};
216 +let secs = secs
217 +.checked_add((nanos / NANOS_PER_SEC) as u64)
218 +.expect("overflow in Duration::new");
221 219 let nanos = nanos % NANOS_PER_SEC;
222 220 // SAFETY: nanos % NANOS_PER_SEC < NANOS_PER_SEC, therefore nanos is within the valid range
223 221 Duration { secs, nanos: unsafe { Nanoseconds(nanos) } }
Original file line number Diff line number Diff line change
@@ -18,17 +18,6 @@ use crate::sys_common::AsInner;
18 18 use crate::sys_common::wstr::WStrUnits;
19 19 use crate::{fmt, io, iter, vec};
20 20
21 -/// This is the const equivalent to `NonZero::new(n).unwrap()`
22 -///
23 -/// FIXME(const-hack): This can be removed once `Option::unwrap` is stably const.
24 -/// See the `const_option` feature (#67441).
25 -const fn non_zero_u16(n: u16) -> NonZero<u16> {
26 -match NonZero::new(n) {
27 -Some(n) => n,
28 -None => panic!("called `unwrap` on a `None` value"),
29 -}
30 -}
31 -
32 21 pub fn args() -> Args {
33 22 // SAFETY: `GetCommandLineW` returns a pointer to a null terminated UTF-16
34 23 // string so it's safe for `WStrUnits` to use.
@@ -66,10 +55,10 @@ fn parse_lp_cmd_line<'a, F: Fn() -> OsString>(
66 55 lp_cmd_line: Option<WStrUnits<'a>>,
67 56 exe_name: F,
68 57 ) -> Vec<OsString> {
69 -const BACKSLASH: NonZero<u16> = non_zero_u16(b'\\' as u16);
70 -const QUOTE: NonZero<u16> = non_zero_u16(b'"' as u16);
71 -const TAB: NonZero<u16> = non_zero_u16(b'\t' as u16);
72 -const SPACE: NonZero<u16> = non_zero_u16(b' ' as u16);
58 +const BACKSLASH: NonZero<u16> = NonZero::new(b'\\' as u16).unwrap();
59 +const QUOTE: NonZero<u16> = NonZero::new(b'"' as u16).unwrap();
60 +const TAB: NonZero<u16> = NonZero::new(b'\t' as u16).unwrap();
61 +const SPACE: NonZero<u16> = NonZero::new(b' ' as u16).unwrap();
73 62
74 63 let mut ret_val = Vec::new();
75 64 // If the cmd line pointer is null or it points to an empty string then