Skip to content

Commit eb2fc42

Browse files
authored
Rollup merge of #124941 - Skgland:stabilize-const-int-from-str, r=dtolnay
Stabilize const `{integer}::from_str_radix` i.e. `const_int_from_str` This PR stabilizes the feature `const_int_from_str`. - ACP Issue: rust-lang/libs-team#74 - Implementation PR: rust-lang/rust#99322 - Part of Tracking Issue: rust-lang/rust#59133 API Change Diff: ```diff impl {integer} { - pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError>; + pub const fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError>; } impl ParseIntError { - pub fn kind(&self) -> &IntErrorKind; + pub const fn kind(&self) -> &IntErrorKind; } ``` This makes it easier to parse integers at compile-time, e.g. the example from the Tracking Issue: ```rust env!("SOMETHING").parse::<usize>().unwrap() ``` could now be achived with ```rust match usize::from_str_radix(env!("SOMETHING"), 10) { Ok(val) => val, Err(err) => panic!("Invalid value for SOMETHING environment variable."), } ``` rather than having to depend on a library that implements or manually implement the parsing at compile-time. --- Checklist based on [Libs Stabilization Guide - When there's const involved](https://std-dev-guide.rust-lang.org/development/stabilization.html#when-theres-const-involved) I am treating this as a [partial stabilization](https://std-dev-guide.rust-lang.org/development/stabilization.html#partial-stabilizations) as it shares a tracking issue (and is rather small), so directly opening the partial stabilization PR for the subset (feature `const_int_from_str`) being stabilized. - [x] ping Constant Evaluation WG - [x] no unsafe involved - [x] no `#[allow_internal_unstable]` - [ ] usage of `intrinsic::const_eval_select` rust-lang/rust#124625 in `from_str_radix_assert` to change the error message between compile-time and run-time - [ ] [rust-labg/libs-api FCP](rust-lang/rust#124941 (comment))
2 parents 2acbd31 + 26cdeed commit eb2fc42

File tree

3 files changed

+12
-12
lines changed

3 files changed

+12
-12
lines changed

tests/ui/from_str_radix_10.fixed

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(const_int_from_str)]
21
#![warn(clippy::from_str_radix_10)]
32

43
mod some_mod {
@@ -61,7 +60,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
6160
Ok(())
6261
}
6362

64-
fn issue_12732() {
63+
// https://github.com/rust-lang/rust-clippy/issues/12731
64+
fn issue_12731() {
6565
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
6666
const B: () = {
6767
let _ = u32::from_str_radix("123", 10);

tests/ui/from_str_radix_10.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(const_int_from_str)]
21
#![warn(clippy::from_str_radix_10)]
32

43
mod some_mod {
@@ -61,7 +60,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
6160
Ok(())
6261
}
6362

64-
fn issue_12732() {
63+
// https://github.com/rust-lang/rust-clippy/issues/12731
64+
fn issue_12731() {
6565
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
6666
const B: () = {
6767
let _ = u32::from_str_radix("123", 10);

tests/ui/from_str_radix_10.stderr

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
2-
--> tests/ui/from_str_radix_10.rs:29:5
2+
--> tests/ui/from_str_radix_10.rs:28:5
33
|
44
LL | u32::from_str_radix("30", 10)?;
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"30".parse::<u32>()`
@@ -8,43 +8,43 @@ LL | u32::from_str_radix("30", 10)?;
88
= help: to override `-D warnings` add `#[allow(clippy::from_str_radix_10)]`
99

1010
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
11-
--> tests/ui/from_str_radix_10.rs:32:5
11+
--> tests/ui/from_str_radix_10.rs:31:5
1212
|
1313
LL | i64::from_str_radix("24", 10)?;
1414
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"24".parse::<i64>()`
1515

1616
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
17-
--> tests/ui/from_str_radix_10.rs:34:5
17+
--> tests/ui/from_str_radix_10.rs:33:5
1818
|
1919
LL | isize::from_str_radix("100", 10)?;
2020
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"100".parse::<isize>()`
2121

2222
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
23-
--> tests/ui/from_str_radix_10.rs:36:5
23+
--> tests/ui/from_str_radix_10.rs:35:5
2424
|
2525
LL | u8::from_str_radix("7", 10)?;
2626
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"7".parse::<u8>()`
2727

2828
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
29-
--> tests/ui/from_str_radix_10.rs:38:5
29+
--> tests/ui/from_str_radix_10.rs:37:5
3030
|
3131
LL | u16::from_str_radix(&("10".to_owned() + "5"), 10)?;
3232
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("10".to_owned() + "5").parse::<u16>()`
3333

3434
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
35-
--> tests/ui/from_str_radix_10.rs:40:5
35+
--> tests/ui/from_str_radix_10.rs:39:5
3636
|
3737
LL | i128::from_str_radix(Test + Test, 10)?;
3838
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(Test + Test).parse::<i128>()`
3939

4040
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
41-
--> tests/ui/from_str_radix_10.rs:44:5
41+
--> tests/ui/from_str_radix_10.rs:43:5
4242
|
4343
LL | i32::from_str_radix(string, 10)?;
4444
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `string.parse::<i32>()`
4545

4646
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
47-
--> tests/ui/from_str_radix_10.rs:48:5
47+
--> tests/ui/from_str_radix_10.rs:47:5
4848
|
4949
LL | i32::from_str_radix(&stringier, 10)?;
5050
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `stringier.parse::<i32>()`

0 commit comments

Comments
 (0)