about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/from_str_radix_10.rs11
-rw-r--r--tests/ui/from_str_radix_10.rs13
-rw-r--r--tests/ui/from_str_radix_10.stderr34
3 files changed, 45 insertions, 13 deletions
diff --git a/clippy_lints/src/from_str_radix_10.rs b/clippy_lints/src/from_str_radix_10.rs
index de9add4b6b6..993b85ed998 100644
--- a/clippy_lints/src/from_str_radix_10.rs
+++ b/clippy_lints/src/from_str_radix_10.rs
@@ -5,6 +5,7 @@ use rustc_lint::{LateContext, LateLintPass};
 use rustc_session::{declare_lint_pass, declare_tool_lint};
 
 use crate::utils::span_lint_and_sugg;
+use crate::utils::sugg::Sugg;
 
 declare_clippy_lint! {
     /// **What it does:**
@@ -58,14 +59,20 @@ impl LateLintPass<'tcx> for FromStrRadix10 {
             if let rustc_ast::ast::LitKind::Int(10, _) = lit.node;
 
             then {
-                let orig_string = crate::utils::snippet(cx, arguments[0].span, "string");
+                let sugg = Sugg::hir_with_applicability(
+                    cx,
+                    &arguments[0],
+                    "<string>",
+                    &mut Applicability::MachineApplicable
+                ).maybe_par();
+
                 span_lint_and_sugg(
                     cx,
                     FROM_STR_RADIX_10,
                     exp.span,
                     "this call to `from_str_radix` can be replaced with a call to `str::parse`",
                     "try",
-                    format!("({}).parse()", orig_string),
+                    format!("{}.parse::<{}>()", sugg, prim_ty.name_str()),
                     Applicability::MaybeIncorrect
                 );
             }
diff --git a/tests/ui/from_str_radix_10.rs b/tests/ui/from_str_radix_10.rs
index 2d8106da7ba..0a973128664 100644
--- a/tests/ui/from_str_radix_10.rs
+++ b/tests/ui/from_str_radix_10.rs
@@ -12,12 +12,25 @@ fn from_str_radix(_: &str, _: u32) -> Result<(), std::num::ParseIntError> {
     unimplemented!()
 }
 
+// to test parenthesis addition
+struct Test;
+
+impl std::ops::Add<Test> for Test {
+    type Output = &'static str;
+
+    fn add(self, _: Self) -> Self::Output {
+        "304"
+    }
+}
+
 fn main() -> Result<(), Box<dyn std::error::Error>> {
     // all of these should trigger the lint
     u32::from_str_radix("30", 10)?;
     i64::from_str_radix("24", 10)?;
     isize::from_str_radix("100", 10)?;
     u8::from_str_radix("7", 10)?;
+    u16::from_str_radix(&("10".to_owned() + "5"), 10)?;
+    i128::from_str_radix(Test + Test, 10)?;
 
     let string = "300";
     i32::from_str_radix(string, 10)?;
diff --git a/tests/ui/from_str_radix_10.stderr b/tests/ui/from_str_radix_10.stderr
index 5557cd3b9ef..d6669001915 100644
--- a/tests/ui/from_str_radix_10.stderr
+++ b/tests/ui/from_str_radix_10.stderr
@@ -1,34 +1,46 @@
 error: this call to `from_str_radix` can be replaced with a call to `str::parse`
-  --> $DIR/from_str_radix_10.rs:17:5
+  --> $DIR/from_str_radix_10.rs:28:5
    |
 LL |     u32::from_str_radix("30", 10)?;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("30").parse()`
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"30".parse::<u32>()`
    |
    = note: `-D clippy::from-str-radix-10` implied by `-D warnings`
 
 error: this call to `from_str_radix` can be replaced with a call to `str::parse`
-  --> $DIR/from_str_radix_10.rs:18:5
+  --> $DIR/from_str_radix_10.rs:29:5
    |
 LL |     i64::from_str_radix("24", 10)?;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("24").parse()`
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"24".parse::<i64>()`
 
 error: this call to `from_str_radix` can be replaced with a call to `str::parse`
-  --> $DIR/from_str_radix_10.rs:19:5
+  --> $DIR/from_str_radix_10.rs:30:5
    |
 LL |     isize::from_str_radix("100", 10)?;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("100").parse()`
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"100".parse::<isize>()`
 
 error: this call to `from_str_radix` can be replaced with a call to `str::parse`
-  --> $DIR/from_str_radix_10.rs:20:5
+  --> $DIR/from_str_radix_10.rs:31:5
    |
 LL |     u8::from_str_radix("7", 10)?;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("7").parse()`
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"7".parse::<u8>()`
 
 error: this call to `from_str_radix` can be replaced with a call to `str::parse`
-  --> $DIR/from_str_radix_10.rs:23:5
+  --> $DIR/from_str_radix_10.rs:32: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`
+  --> $DIR/from_str_radix_10.rs:33: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`
+  --> $DIR/from_str_radix_10.rs:36:5
    |
 LL |     i32::from_str_radix(string, 10)?;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(string).parse()`
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `string.parse::<i32>()`
 
-error: aborting due to 5 previous errors
+error: aborting due to 7 previous errors