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>)
|
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:
|
||||||
//
|
//
|
||||||
|
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