diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-02-12 20:36:53 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-12 20:36:53 +0100 |
| commit | 2a3c1a30c84d66ad9bde8aef7727dfd6b60c40c9 (patch) | |
| tree | ce940a78c5bacb1bb1f7aa31e286e023297940c7 /src | |
| parent | f127aba96d1f0610f854e54a3386023c2331b1f3 (diff) | |
| parent | 9d91489526121ef3408e1efa2a98bcaefdedd9bc (diff) | |
| download | rust-2a3c1a30c84d66ad9bde8aef7727dfd6b60c40c9.tar.gz rust-2a3c1a30c84d66ad9bde8aef7727dfd6b60c40c9.zip | |
Rollup merge of #68981 - estebank:silence, r=davidtwco
Account for type params on method without parentheses Account for those type parameters in the structured suggestion when forgetting to call method: ``` error[E0615]: attempted to take value of method `collect` on type `std::vec::IntoIter<_>` --> $DIR/method-missing-parentheses.rs:2:32 | LL | let _ = vec![].into_iter().collect::<usize>; | ^^^^^^^--------- | | | help: use parentheses to call the method: `collect::<usize>()` ```
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_parse/parser/expr.rs | 2 | ||||
| -rw-r--r-- | src/librustc_typeck/check/expr.rs | 4 | ||||
| -rw-r--r-- | src/librustc_typeck/check/method/mod.rs | 18 | ||||
| -rw-r--r-- | src/test/ui/parser/type-parameters-in-field-exprs.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/parser/type-parameters-in-field-exprs.stderr | 6 | ||||
| -rw-r--r-- | src/test/ui/suggestions/method-missing-parentheses.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/suggestions/method-missing-parentheses.stderr | 17 |
7 files changed, 44 insertions, 14 deletions
diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index c8c0ba4c66e..77748d16653 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -823,7 +823,7 @@ impl<'a> Parser<'a> { if let Some(args) = segment.args { self.struct_span_err( args.span(), - "field expressions may not have generic arguments", + "field expressions cannot have generic arguments", ) .emit(); } diff --git a/src/librustc_typeck/check/expr.rs b/src/librustc_typeck/check/expr.rs index 9ce89bd6363..90b7b300da9 100644 --- a/src/librustc_typeck/check/expr.rs +++ b/src/librustc_typeck/check/expr.rs @@ -1586,7 +1586,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { &format!("a method `{}` also exists, call it with parentheses", field), field, expr_t, - expr.hir_id, + expr, ); } err.emit(); @@ -1609,7 +1609,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { "use parentheses to call the method", field, expr_t, - expr.hir_id, + expr, ); } else { err.help("methods are immutable and cannot be assigned to"); diff --git a/src/librustc_typeck/check/method/mod.rs b/src/librustc_typeck/check/method/mod.rs index 67d8030a9d6..c3e15c507b3 100644 --- a/src/librustc_typeck/check/method/mod.rs +++ b/src/librustc_typeck/check/method/mod.rs @@ -135,7 +135,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { msg: &str, method_name: ast::Ident, self_ty: Ty<'tcx>, - call_expr_id: hir::HirId, + call_expr: &hir::Expr<'_>, ) { let has_params = self .probe_for_name( @@ -144,7 +144,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { method_name, IsSuggestion(false), self_ty, - call_expr_id, + call_expr.hir_id, ProbeScope::TraitsInScope, ) .and_then(|pick| { @@ -152,13 +152,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { Ok(sig.inputs().skip_binder().len() > 1) }); + // Account for `foo.bar<T>`; + let sugg_span = method_name.span.with_hi(call_expr.span.hi()); + let snippet = self + .tcx + .sess + .source_map() + .span_to_snippet(sugg_span) + .unwrap_or_else(|_| method_name.to_string()); let (suggestion, applicability) = if has_params.unwrap_or_default() { - (format!("{}(...)", method_name), Applicability::HasPlaceholders) + (format!("{}(...)", snippet), Applicability::HasPlaceholders) } else { - (format!("{}()", method_name), Applicability::MaybeIncorrect) + (format!("{}()", snippet), Applicability::MaybeIncorrect) }; - err.span_suggestion(method_name.span, msg, suggestion, applicability); + err.span_suggestion(sugg_span, msg, suggestion, applicability); } /// Performs method lookup. If lookup is successful, it will return the callee diff --git a/src/test/ui/parser/type-parameters-in-field-exprs.rs b/src/test/ui/parser/type-parameters-in-field-exprs.rs index 6a3b2c1c606..4cd77ebbd86 100644 --- a/src/test/ui/parser/type-parameters-in-field-exprs.rs +++ b/src/test/ui/parser/type-parameters-in-field-exprs.rs @@ -9,9 +9,9 @@ fn main() { y: 2, }; f.x::<isize>; - //~^ ERROR field expressions may not have generic arguments + //~^ ERROR field expressions cannot have generic arguments f.x::<>; - //~^ ERROR field expressions may not have generic arguments + //~^ ERROR field expressions cannot have generic arguments f.x::(); - //~^ ERROR field expressions may not have generic arguments + //~^ ERROR field expressions cannot have generic arguments } diff --git a/src/test/ui/parser/type-parameters-in-field-exprs.stderr b/src/test/ui/parser/type-parameters-in-field-exprs.stderr index 306b4754d0d..ce7364d3534 100644 --- a/src/test/ui/parser/type-parameters-in-field-exprs.stderr +++ b/src/test/ui/parser/type-parameters-in-field-exprs.stderr @@ -1,16 +1,16 @@ -error: field expressions may not have generic arguments +error: field expressions cannot have generic arguments --> $DIR/type-parameters-in-field-exprs.rs:11:10 | LL | f.x::<isize>; | ^^^^^^^ -error: field expressions may not have generic arguments +error: field expressions cannot have generic arguments --> $DIR/type-parameters-in-field-exprs.rs:13:10 | LL | f.x::<>; | ^^ -error: field expressions may not have generic arguments +error: field expressions cannot have generic arguments --> $DIR/type-parameters-in-field-exprs.rs:15:7 | LL | f.x::(); diff --git a/src/test/ui/suggestions/method-missing-parentheses.rs b/src/test/ui/suggestions/method-missing-parentheses.rs new file mode 100644 index 00000000000..f10bfb56d2e --- /dev/null +++ b/src/test/ui/suggestions/method-missing-parentheses.rs @@ -0,0 +1,5 @@ +fn main() { + let _ = vec![].into_iter().collect::<usize>; + //~^ ERROR attempted to take value of method `collect` on type `std::vec::IntoIter<_>` + //~| ERROR field expressions cannot have generic arguments +} diff --git a/src/test/ui/suggestions/method-missing-parentheses.stderr b/src/test/ui/suggestions/method-missing-parentheses.stderr new file mode 100644 index 00000000000..6e4f7a84724 --- /dev/null +++ b/src/test/ui/suggestions/method-missing-parentheses.stderr @@ -0,0 +1,17 @@ +error: field expressions cannot have generic arguments + --> $DIR/method-missing-parentheses.rs:2:41 + | +LL | let _ = vec![].into_iter().collect::<usize>; + | ^^^^^^^ + +error[E0615]: attempted to take value of method `collect` on type `std::vec::IntoIter<_>` + --> $DIR/method-missing-parentheses.rs:2:32 + | +LL | let _ = vec![].into_iter().collect::<usize>; + | ^^^^^^^--------- + | | + | help: use parentheses to call the method: `collect::<usize>()` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0615`. |
