Skip to content

Commit

Permalink
Auto merge of #12787 - J-ZhengLi:issue127311, r=blyxyas
Browse files Browse the repository at this point in the history
make [`from_str_radix_10`] skip constant context

fixes: #12731

---

changelog: make [`from_str_radix_10`] skip constant context
  • Loading branch information
bors committed May 12, 2024
2 parents 2b34abc + 904c99c commit 9b446c7
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 9 deletions.
5 changes: 4 additions & 1 deletion clippy_lints/src/from_str_radix_10.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::is_integer_literal;
use clippy_utils::sugg::Sugg;
use clippy_utils::ty::{is_type_diagnostic_item, is_type_lang_item};
use clippy_utils::{in_constant, is_integer_literal};
use rustc_errors::Applicability;
use rustc_hir::{def, Expr, ExprKind, LangItem, PrimTy, QPath, TyKind};
use rustc_lint::{LateContext, LateLintPass};
Expand Down Expand Up @@ -47,6 +47,9 @@ impl<'tcx> LateLintPass<'tcx> for FromStrRadix10 {
fn check_expr(&mut self, cx: &LateContext<'tcx>, exp: &Expr<'tcx>) {
if let ExprKind::Call(maybe_path, [src, radix]) = &exp.kind
&& let ExprKind::Path(QPath::TypeRelative(ty, pathseg)) = &maybe_path.kind
// do not lint in constant context, because the suggestion won't work.
// NB: keep this check until a new `const_trait_impl` is available and stablized.
&& !in_constant(cx, exp.hir_id)

// check if the first part of the path is some integer primitive
&& let TyKind::Path(ty_qpath) = &ty.kind
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/from_str_radix_10.fixed
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![feature(const_int_from_str)]
#![warn(clippy::from_str_radix_10)]

mod some_mod {
Expand Down Expand Up @@ -59,3 +60,13 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {

Ok(())
}

fn issue_12732() {
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
const B: () = {
let _ = u32::from_str_radix("123", 10);
};
const fn foo() {
let _ = u32::from_str_radix("123", 10);
}
}
11 changes: 11 additions & 0 deletions tests/ui/from_str_radix_10.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![feature(const_int_from_str)]
#![warn(clippy::from_str_radix_10)]

mod some_mod {
Expand Down Expand Up @@ -59,3 +60,13 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {

Ok(())
}

fn issue_12732() {
const A: Result<u32, std::num::ParseIntError> = u32::from_str_radix("123", 10);
const B: () = {
let _ = u32::from_str_radix("123", 10);
};
const fn foo() {
let _ = u32::from_str_radix("123", 10);
}
}
16 changes: 8 additions & 8 deletions tests/ui/from_str_radix_10.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> tests/ui/from_str_radix_10.rs:28:5
--> tests/ui/from_str_radix_10.rs:29:5
|
LL | u32::from_str_radix("30", 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"30".parse::<u32>()`
Expand All @@ -8,43 +8,43 @@ LL | u32::from_str_radix("30", 10)?;
= help: to override `-D warnings` add `#[allow(clippy::from_str_radix_10)]`

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

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

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

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

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

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

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

0 comments on commit 9b446c7

Please sign in to comment.