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:
//
--- /dev/null
+// 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";
+}
--- /dev/null
+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
+