Rollup merge of #87566 - JohnTitor:find-eqeq-on-assoc-type-bounds, r=estebank

Recover invalid assoc type bounds using `==`

Fix #87493
r? `@estebank`
This commit is contained in:
Guillaume Gomez 2021-09-17 17:41:14 +02:00 committed by GitHub
commit 1b7896716e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 1 deletions

View File

@ -1950,7 +1950,19 @@ impl<'a> Parser<'a> {
}
match self.parse_expr_res(Restrictions::CONST_EXPR, None) {
Ok(expr) => {
if token::Comma == self.token.kind || self.token.kind.should_end_const_arg() {
// Find a mistake like `MyTrait<Assoc == S::Assoc>`.
if token::EqEq == snapshot.token.kind {
err.span_suggestion(
snapshot.token.span,
"if you meant to use an associated type binding, replace `==` with `=`",
"=".to_string(),
Applicability::MaybeIncorrect,
);
let value = self.mk_expr_err(start.to(expr.span));
err.emit();
return Ok(GenericArg::Const(AnonConst { id: ast::DUMMY_NODE_ID, value }));
} else if token::Comma == self.token.kind || self.token.kind.should_end_const_arg()
{
// Avoid the following output by checking that we consumed a full const arg:
// help: expressions must be enclosed in braces to be used as const generic
// arguments

View File

@ -0,0 +1,14 @@
pub trait MyTrait {
type Assoc;
}
pub fn foo<S, T>(_s: S, _t: T)
where
S: MyTrait,
T: MyTrait<Assoc == S::Assoc>,
//~^ ERROR: expected one of `,` or `>`, found `==`
//~| ERROR: this trait takes 0 generic arguments but 1 generic argument was supplied
{
}
fn main() {}

View File

@ -0,0 +1,28 @@
error: expected one of `,` or `>`, found `==`
--> $DIR/issue-87493.rs:8:22
|
LL | T: MyTrait<Assoc == S::Assoc>,
| ^^ expected one of `,` or `>`
|
help: if you meant to use an associated type binding, replace `==` with `=`
|
LL | T: MyTrait<Assoc = S::Assoc>,
| ~
error[E0107]: this trait takes 0 generic arguments but 1 generic argument was supplied
--> $DIR/issue-87493.rs:8:8
|
LL | T: MyTrait<Assoc == S::Assoc>,
| ^^^^^^^------------------- help: remove these generics
| |
| expected 0 generic arguments
|
note: trait defined here, with 0 generic parameters
--> $DIR/issue-87493.rs:1:11
|
LL | pub trait MyTrait {
| ^^^^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0107`.