mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 07:22:42 +00:00
Suggest changing literals instead of calling methods (fixes #44307)
This commit is contained in:
parent
2f1ef9ef11
commit
ddd01455e9
@ -207,7 +207,29 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
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:
|
||||
//
|
||||
|
16
src/test/ui/str-lit-type-mismatch.rs
Normal file
16
src/test/ui/str-lit-type-mismatch.rs
Normal 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";
|
||||
}
|
32
src/test/ui/str-lit-type-mismatch.stderr
Normal file
32
src/test/ui/str-lit-type-mismatch.stderr
Normal 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
|
||||
|
Loading…
Reference in New Issue
Block a user