-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
type error method suggestions use whitelisted identity-like conversions
Previously, on a type mismatch (and if this wasn't preëmpted by a higher-priority suggestion), we would look for argumentless methods returning the expected type, and list them in a `help` note. This had two major shortcomings. Firstly, a lot of the suggestions didn't really make sense (if you used a &str where a String was expected, `.to_ascii_uppercase()` is probably not the solution you were hoping for). Secondly, we weren't generating suggestions from the most useful traits! We address the first problem with an internal `#[rustc_conversion_suggestion]` attribute meant to mark methods that keep the "same value" in the relevant sense, just converting the type. We address the second problem by making `FnCtxt.probe_for_return_type` pass the `ProbeScope::AllTraits` to `probe_op`: this would seem to be safe because grep reveals no other callers of `probe_for_return_type`. Also, structured suggestions are preferred (because they're pretty, but also for RLS and friends). Also also, we make the E0055 autoderef recursion limit error use the one-time-diagnostics set, because we can potentially hit the limit a lot during probing. (Without this, test/ui/did_you_mean/recursion_limit_deref.rs would report "aborting due to 51 errors"). Unfortunately, the trait probing is still not all one would hope for: at a minimum, we don't know how to rule out `into()` in cases where it wouldn't actually work, and we don't know how to rule in `.to_owned()` where it would. Issues #46459 and #46460 have been filed and are ref'd in a FIXME. This is hoped to resolve #42929, #44672, and #45777.
- Loading branch information
1 parent
72176cf
commit aba56dd
Showing
14 changed files
with
147 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// Copyright 2017 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. | ||
|
||
use std::path::{Path, PathBuf}; | ||
|
||
|
||
fn main() { | ||
let _tis_an_instants_play: String = "'Tis a fond Ambush—"; //~ ERROR mismatched types | ||
let _just_to_make_bliss: PathBuf = Path::new("/ern/her/own/surprise"); | ||
//~^ ERROR mismatched types | ||
|
||
let _but_should_the_play: String = 2; // Perhaps surprisingly, we suggest .to_string() here | ||
//~^ ERROR mismatched types | ||
|
||
let _prove_piercing_earnest: Vec<usize> = &[1, 2, 3]; //~ ERROR mismatched types | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
error[E0308]: mismatched types | ||
--> $DIR/conversion-methods.rs:15:41 | ||
| | ||
15 | let _tis_an_instants_play: String = "'Tis a fond Ambush—"; //~ ERROR mismatched types | ||
| ^^^^^^^^^^^^^^^^^^^^^ | ||
| | | ||
| expected struct `std::string::String`, found reference | ||
| help: try using a conversion method: `"'Tis a fond Ambush—".to_string()` | ||
| | ||
= note: expected type `std::string::String` | ||
found type `&'static str` | ||
|
||
error[E0308]: mismatched types | ||
--> $DIR/conversion-methods.rs:16:40 | ||
| | ||
16 | let _just_to_make_bliss: PathBuf = Path::new("/ern/her/own/surprise"); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | | ||
| expected struct `std::path::PathBuf`, found reference | ||
| help: try using a conversion method: `Path::new("/ern/her/own/surprise").to_path_buf()` | ||
| | ||
= note: expected type `std::path::PathBuf` | ||
found type `&std::path::Path` | ||
|
||
error[E0308]: mismatched types | ||
--> $DIR/conversion-methods.rs:19:40 | ||
| | ||
19 | let _but_should_the_play: String = 2; // Perhaps surprisingly, we suggest .to_string() here | ||
| ^ | ||
| | | ||
| expected struct `std::string::String`, found integral variable | ||
| help: try using a conversion method: `2.to_string()` | ||
| | ||
= note: expected type `std::string::String` | ||
found type `{integer}` | ||
|
||
error[E0308]: mismatched types | ||
--> $DIR/conversion-methods.rs:22:47 | ||
| | ||
22 | let _prove_piercing_earnest: Vec<usize> = &[1, 2, 3]; //~ ERROR mismatched types | ||
| ^^^^^^^^^^ | ||
| | | ||
| expected struct `std::vec::Vec`, found reference | ||
| help: try using a conversion method: `&[1, 2, 3].to_vec()` | ||
| | ||
= note: expected type `std::vec::Vec<usize>` | ||
found type `&[{integer}; 3]` | ||
|
||
error: aborting due to 4 previous errors | ||
|