]> git.lizzy.rs Git - rust.git/commitdiff
Suggest changing literals instead of calling methods (fixes #44307)
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Wed, 6 Sep 2017 08:09:25 +0000 (10:09 +0200)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Wed, 6 Sep 2017 08:09:25 +0000 (10:09 +0200)
src/librustc_typeck/check/demand.rs
src/test/ui/str-lit-type-mismatch.rs [new file with mode: 0644]
src/test/ui/str-lit-type-mismatch.stderr [new file with mode: 0644]

index fc241c023cdaf25f6e3c8f3fe4e51db2e357ee38..65900dc3f36e7d8242903846e0995187ac6858ee 100644 (file)
@@ -207,7 +207,29 @@ fn check_ref(&self,
                  expected: Ty<'tcx>)
                  -> Option<String> {
         match (&expected.sty, &checked_ty.sty) {
-            (&ty::TyRef(_, _), &ty::TyRef(_, _)) => None,
+            (&ty::TyRef(_, exp), &ty::TyRef(_, check)) => match (&exp.ty.sty, &check.ty.sty) {
+                (&ty::TyStr, &ty::TyArray(arr, _)) |
+                (&ty::TyStr, &ty::TySlice(arr)) if arr == self.tcx.types.u8 => {
+                    if let hir::ExprLit(_) = expr.node {
+                        let sp = self.sess().codemap().call_span_if_macro(expr.span);
+                        if let Ok(src) = self.tcx.sess.codemap().span_to_snippet(sp) {
+                            return Some(format!("try `{}`", &src[1..]));
+                        }
+                    }
+                    None
+                },
+                (&ty::TyArray(arr, _), &ty::TyStr) |
+                (&ty::TySlice(arr), &ty::TyStr) if arr == self.tcx.types.u8 => {
+                    if let hir::ExprLit(_) = expr.node {
+                        let sp = self.sess().codemap().call_span_if_macro(expr.span);
+                        if let Ok(src) = self.tcx.sess.codemap().span_to_snippet(sp) {
+                            return Some(format!("try `b{}`", src));
+                        }
+                    }
+                    None
+                }
+                _ => None,
+            },
             (&ty::TyRef(_, mutability), _) => {
                 // Check if it can work when put into a ref. For example:
                 //
diff --git a/src/test/ui/str-lit-type-mismatch.rs b/src/test/ui/str-lit-type-mismatch.rs
new file mode 100644 (file)
index 0000000..0fd7d3a
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+
+fn main() {
+    let x: &[u8] = "foo";
+    let y: &[u8; 4] = "baaa";
+    let z: &str = b"foo";
+}
diff --git a/src/test/ui/str-lit-type-mismatch.stderr b/src/test/ui/str-lit-type-mismatch.stderr
new file mode 100644 (file)
index 0000000..4741852
--- /dev/null
@@ -0,0 +1,32 @@
+error[E0308]: mismatched types
+  --> $DIR/str-lit-type-mismatch.rs:13:20
+   |
+13 |     let x: &[u8] = "foo";
+   |                    ^^^^^ expected slice, found str
+   |
+   = note: expected type `&[u8]`
+              found type `&'static str`
+   = help: try `b"foo"`
+
+error[E0308]: mismatched types
+  --> $DIR/str-lit-type-mismatch.rs:14:23
+   |
+14 |     let y: &[u8; 4] = "baaa";
+   |                       ^^^^^^ expected array of 4 elements, found str
+   |
+   = note: expected type `&[u8; 4]`
+              found type `&'static str`
+   = help: try `b"baaa"`
+
+error[E0308]: mismatched types
+  --> $DIR/str-lit-type-mismatch.rs:15:19
+   |
+15 |     let z: &str = b"foo";
+   |                   ^^^^^^ expected str, found array of 3 elements
+   |
+   = note: expected type `&str`
+              found type `&'static [u8; 3]`
+   = help: try `"foo"`
+
+error: aborting due to 3 previous errors
+