Don't emit "field expressions may not have generic arguments" if it's a method call without ()
This commit is contained in:
parent
33c245b9e9
commit
014363e89e
6 changed files with 18 additions and 17 deletions
|
@ -576,6 +576,10 @@ pub enum StashKey {
|
||||||
UndeterminedMacroResolution,
|
UndeterminedMacroResolution,
|
||||||
/// Used by `Parser::maybe_recover_trailing_expr`
|
/// Used by `Parser::maybe_recover_trailing_expr`
|
||||||
ExprInPat,
|
ExprInPat,
|
||||||
|
/// If in the parser we detect a field expr with turbofish generic params it's possible that
|
||||||
|
/// it's a method call without parens. If later on in `hir_typeck` we find out that this is
|
||||||
|
/// the case we suppress this message and we give a better suggestion.
|
||||||
|
GenericInFieldExpr,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_track_diagnostic<R>(diag: DiagInner, f: &mut dyn FnMut(DiagInner) -> R) -> R {
|
fn default_track_diagnostic<R>(diag: DiagInner, f: &mut dyn FnMut(DiagInner) -> R) -> R {
|
||||||
|
|
|
@ -3055,7 +3055,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
err.help("methods are immutable and cannot be assigned to");
|
err.help("methods are immutable and cannot be assigned to");
|
||||||
}
|
}
|
||||||
|
|
||||||
err.emit()
|
// See `StashKey::GenericInFieldExpr` for more info
|
||||||
|
self.dcx().try_steal_replace_and_emit_err(field.span, StashKey::GenericInFieldExpr, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn point_at_param_definition(&self, err: &mut Diag<'_>, param: ty::ParamTy) {
|
fn point_at_param_definition(&self, err: &mut Diag<'_>, param: ty::ParamTy) {
|
||||||
|
|
|
@ -1369,11 +1369,14 @@ impl<'a> Parser<'a> {
|
||||||
))
|
))
|
||||||
} else {
|
} else {
|
||||||
// Field access `expr.f`
|
// Field access `expr.f`
|
||||||
|
let span = lo.to(self.prev_token.span);
|
||||||
if let Some(args) = seg.args {
|
if let Some(args) = seg.args {
|
||||||
self.dcx().emit_err(errors::FieldExpressionWithGeneric(args.span()));
|
// See `StashKey::GenericInFieldExpr` for more info on why we stash this.
|
||||||
|
self.dcx()
|
||||||
|
.create_err(errors::FieldExpressionWithGeneric(args.span()))
|
||||||
|
.stash(seg.ident.span, StashKey::GenericInFieldExpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
let span = lo.to(self.prev_token.span);
|
|
||||||
Ok(self.mk_expr(span, ExprKind::Field(self_arg, seg.ident)))
|
Ok(self.mk_expr(span, ExprKind::Field(self_arg, seg.ident)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
error: field expressions cannot have generic arguments
|
|
||||||
--> $DIR/bad-name.rs:2:12
|
|
||||||
|
|
|
||||||
LL | let x.y::<isize>.z foo;
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
||||||
error: expected a pattern, found an expression
|
error: expected a pattern, found an expression
|
||||||
--> $DIR/bad-name.rs:2:7
|
--> $DIR/bad-name.rs:2:7
|
||||||
|
|
|
|
||||||
|
@ -18,5 +12,11 @@ error: expected one of `(`, `.`, `::`, `:`, `;`, `=`, `?`, `|`, or an operator,
|
||||||
LL | let x.y::<isize>.z foo;
|
LL | let x.y::<isize>.z foo;
|
||||||
| ^^^ expected one of 9 possible tokens
|
| ^^^ expected one of 9 possible tokens
|
||||||
|
|
||||||
|
error: field expressions cannot have generic arguments
|
||||||
|
--> $DIR/bad-name.rs:2:12
|
||||||
|
|
|
||||||
|
LL | let x.y::<isize>.z foo;
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
fn main() {
|
fn main() {
|
||||||
let _ = vec![].into_iter().collect::<usize>;
|
let _ = vec![].into_iter().collect::<usize>;
|
||||||
//~^ ERROR attempted to take value of method `collect` on type `std::vec::IntoIter<_>`
|
//~^ ERROR attempted to take value of method `collect` on type `std::vec::IntoIter<_>`
|
||||||
//~| ERROR field expressions cannot have generic arguments
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
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<_>`
|
error[E0615]: attempted to take value of method `collect` on type `std::vec::IntoIter<_>`
|
||||||
--> $DIR/method-missing-parentheses.rs:2:32
|
--> $DIR/method-missing-parentheses.rs:2:32
|
||||||
|
|
|
|
||||||
|
@ -15,6 +9,6 @@ help: use parentheses to call the method
|
||||||
LL | let _ = vec![].into_iter().collect::<usize>();
|
LL | let _ = vec![].into_iter().collect::<usize>();
|
||||||
| ++
|
| ++
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0615`.
|
For more information about this error, try `rustc --explain E0615`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue