Skip to content

Commit

Permalink
Rollup merge of #87566 - JohnTitor:find-eqeq-on-assoc-type-bounds, r=…
Browse files Browse the repository at this point in the history
…estebank

Recover invalid assoc type bounds using `==`

Fix #87493
r? `@estebank`
  • Loading branch information
GuillaumeGomez authored Sep 17, 2021
2 parents aed7f00 + ee99bb3 commit 1b78967
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
14 changes: 13 additions & 1 deletion compiler/rustc_parse/src/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/const-generics/issues/issue-87493.rs
Original file line number Diff line number Diff line change
@@ -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() {}
28 changes: 28 additions & 0 deletions src/test/ui/const-generics/issues/issue-87493.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 1b78967

Please sign in to comment.