Suggest changing literals instead of calling methods (fixes #44307)

This commit is contained in:
Oliver Schneider 2017-09-06 10:09:25 +02:00
parent 2f1ef9ef11
commit ddd01455e9
No known key found for this signature in database
GPG Key ID: A69F8D225B3AD7D9
3 changed files with 71 additions and 1 deletions

View File

@ -207,7 +207,29 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
expected: Ty<'tcx>) expected: Ty<'tcx>)
-> Option<String> { -> Option<String> {
match (&expected.sty, &checked_ty.sty) { 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), _) => { (&ty::TyRef(_, mutability), _) => {
// Check if it can work when put into a ref. For example: // Check if it can work when put into a ref. For example:
// //

View File

@ -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";
}

View File

@ -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