diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-10-01 23:56:24 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-10-01 23:56:24 +0200 |
| commit | 67cbeee9ee2751f5da8312a3cefea77f44d72795 (patch) | |
| tree | ba18c9518f47068545f2bd01b8077923689cc8e7 | |
| parent | 7628cada4f56676c361730251841e65600d863fe (diff) | |
| parent | 9e4eb46790435c38a613d7f9d5d3e0eb5f77fca1 (diff) | |
| download | rust-67cbeee9ee2751f5da8312a3cefea77f44d72795.tar.gz rust-67cbeee9ee2751f5da8312a3cefea77f44d72795.zip | |
Rollup merge of #64933 - sam09:master, r=estebank
Fixes #64919. Suggest fix based on operator precendence. Fixes https://github.com/rust-lang/rust/issues/64919
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/conversion-methods.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/infinite/infinite-autoderef.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/mismatched_types/abridged.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/mismatched_types/abridged.stderr | 30 | ||||
| -rw-r--r-- | src/test/ui/occurs-check-2.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/occurs-check.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/span/coerce-suggestions.stderr | 2 |
8 files changed, 49 insertions, 7 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index be5723959fb..720d31310a1 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -128,6 +128,7 @@ use syntax::attr; use syntax::feature_gate::{GateIssue, emit_feature_err}; use syntax::source_map::{DUMMY_SP, original_sp}; use syntax::symbol::{kw, sym}; +use syntax::util::parser::ExprPrecedence; use std::cell::{Cell, RefCell, Ref, RefMut}; use std::collections::hash_map::Entry; @@ -4345,7 +4346,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let max_len = receiver.rfind(".").unwrap(); format!("{}{}", &receiver[..max_len], method_call) } else { - format!("{}{}", receiver, method_call) + if expr.precedence().order() < ExprPrecedence::MethodCall.order() { + format!("({}){}", receiver, method_call) + } else { + format!("{}{}", receiver, method_call) + } }; Some(if is_struct_pat_shorthand_field { format!("{}: {}", receiver, sugg) diff --git a/src/test/ui/conversion-methods.stderr b/src/test/ui/conversion-methods.stderr index b9662e76074..5c666afb89a 100644 --- a/src/test/ui/conversion-methods.stderr +++ b/src/test/ui/conversion-methods.stderr @@ -41,7 +41,7 @@ LL | let _prove_piercing_earnest: Vec<usize> = &[1, 2, 3]; | ^^^^^^^^^^ | | | expected struct `std::vec::Vec`, found reference - | help: try using a conversion method: `&[1, 2, 3].to_vec()` + | help: try using a conversion method: `(&[1, 2, 3]).to_vec()` | = note: expected type `std::vec::Vec<usize>` found type `&[{integer}; 3]` diff --git a/src/test/ui/infinite/infinite-autoderef.stderr b/src/test/ui/infinite/infinite-autoderef.stderr index a2ad58a7e46..f4567554d0d 100644 --- a/src/test/ui/infinite/infinite-autoderef.stderr +++ b/src/test/ui/infinite/infinite-autoderef.stderr @@ -5,7 +5,7 @@ LL | x = box x; | ^^^^^ | | | cyclic type of infinite size - | help: try using a conversion method: `box x.to_string()` + | help: try using a conversion method: `(box x).to_string()` error[E0055]: reached the recursion limit while auto-dereferencing `Foo` --> $DIR/infinite-autoderef.rs:25:5 diff --git a/src/test/ui/mismatched_types/abridged.rs b/src/test/ui/mismatched_types/abridged.rs index 41ab6d4c578..9a5c183ca34 100644 --- a/src/test/ui/mismatched_types/abridged.rs +++ b/src/test/ui/mismatched_types/abridged.rs @@ -50,4 +50,13 @@ fn e() -> X<X<String, String>, String> { x //~ ERROR mismatched types } +fn f() -> String { + 1+2 //~ ERROR mismatched types +} + + +fn g() -> String { + -2 //~ ERROR mismatched types +} + fn main() {} diff --git a/src/test/ui/mismatched_types/abridged.stderr b/src/test/ui/mismatched_types/abridged.stderr index b7f3b3dde8a..ded12d89c09 100644 --- a/src/test/ui/mismatched_types/abridged.stderr +++ b/src/test/ui/mismatched_types/abridged.stderr @@ -66,6 +66,34 @@ LL | x = note: expected type `X<X<_, std::string::String>, _>` found type `X<X<_, {integer}>, _>` -error: aborting due to 6 previous errors +error[E0308]: mismatched types + --> $DIR/abridged.rs:54:5 + | +LL | fn f() -> String { + | ------ expected `std::string::String` because of return type +LL | 1+2 + | ^^^ + | | + | expected struct `std::string::String`, found integer + | help: try using a conversion method: `(1+2).to_string()` + | + = note: expected type `std::string::String` + found type `{integer}` + +error[E0308]: mismatched types + --> $DIR/abridged.rs:59:5 + | +LL | fn g() -> String { + | ------ expected `std::string::String` because of return type +LL | -2 + | ^^ + | | + | expected struct `std::string::String`, found integer + | help: try using a conversion method: `(-2).to_string()` + | + = note: expected type `std::string::String` + found type `{integer}` + +error: aborting due to 8 previous errors For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/occurs-check-2.stderr b/src/test/ui/occurs-check-2.stderr index 74e29a5aea7..7f93697c6f7 100644 --- a/src/test/ui/occurs-check-2.stderr +++ b/src/test/ui/occurs-check-2.stderr @@ -5,7 +5,7 @@ LL | f = box g; | ^^^^^ | | | cyclic type of infinite size - | help: try using a conversion method: `box g.to_string()` + | help: try using a conversion method: `(box g).to_string()` error: aborting due to previous error diff --git a/src/test/ui/occurs-check.stderr b/src/test/ui/occurs-check.stderr index 61ce61b1cbe..01e2b1f7749 100644 --- a/src/test/ui/occurs-check.stderr +++ b/src/test/ui/occurs-check.stderr @@ -5,7 +5,7 @@ LL | f = box f; | ^^^^^ | | | cyclic type of infinite size - | help: try using a conversion method: `box f.to_string()` + | help: try using a conversion method: `(box f).to_string()` error: aborting due to previous error diff --git a/src/test/ui/span/coerce-suggestions.stderr b/src/test/ui/span/coerce-suggestions.stderr index 996d80a07e0..0d15a2a753e 100644 --- a/src/test/ui/span/coerce-suggestions.stderr +++ b/src/test/ui/span/coerce-suggestions.stderr @@ -44,7 +44,7 @@ LL | f = box f; | ^^^^^ | | | cyclic type of infinite size - | help: try using a conversion method: `box f.to_string()` + | help: try using a conversion method: `(box f).to_string()` error[E0308]: mismatched types --> $DIR/coerce-suggestions.rs:21:9 |
