Skip to content

Commit

Permalink
Rollup merge of #44361 - oli-obk:lit_sugg, r=nikomatsakis
Browse files Browse the repository at this point in the history
Suggest changing literals instead of calling methods (fixes #44307)
  • Loading branch information
Mark-Simulacrum authored Sep 7, 2017
2 parents 48dcebd + ddd0145 commit f8b7c3e
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 1 deletion.
24 changes: 23 additions & 1 deletion src/librustc_typeck/check/demand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
//
Expand Down
16 changes: 16 additions & 0 deletions src/test/ui/str-lit-type-mismatch.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 32 additions & 0 deletions src/test/ui/str-lit-type-mismatch.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit f8b7c3e

Please sign in to comment.