Skip to content

Commit

Permalink
Rollup merge of #111230 - zacklukem:eq-less-to-less-eq, r=compiler-er…
Browse files Browse the repository at this point in the history
…rors

add hint for =< as <=

Adds a compiler hint for when `=<` is typed instead of `<=`

Example hint:
```rust
fn foo() {
    if 1 =< 3 {
        println!("Hello, World!");
    }
}
```
```
error: expected type, found `3`
 --> main.rs:2:13
  |
2 |     if 1 =< 3 {
  |          -- ^ expected type
  |          |
  |          help: did you mean: `<=`
```

This PR only emits the suggestion if there is no space between the `=` and `<`.  This hopefully narrows the scope of when this error is emitted, however this still allows this error to be emitted in cases such as this:
```
error: expected expression, found `;`
 --> main.rs:2:18
  |
2 |     if 1 =< [i32;; 3]>::hello() {
  |          --      ^ expected expression
  |          |
  |          help: did you mean: `<=`
```

Which could be a good reason not to merge since I haven't been able to think of any other ways of narrowing the scope of this diagnostic.

closes #111128
  • Loading branch information
matthiaskrgr authored May 6, 2023
2 parents f440999 + a183ac6 commit 83b29ec
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 1 deletion.
13 changes: 12 additions & 1 deletion compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1448,8 +1448,19 @@ impl<'a> Parser<'a> {
}

fn parse_expr_path_start(&mut self) -> PResult<'a, P<Expr>> {
let maybe_eq_tok = self.prev_token.clone();
let (qself, path) = if self.eat_lt() {
let (qself, path) = self.parse_qpath(PathStyle::Expr)?;
let lt_span = self.prev_token.span;
let (qself, path) = self.parse_qpath(PathStyle::Expr).map_err(|mut err| {
// Suggests using '<=' if there is an error parsing qpath when the previous token
// is an '=' token. Only emits suggestion if the '<' token and '=' token are
// directly adjacent (i.e. '=<')
if maybe_eq_tok.kind == TokenKind::Eq && maybe_eq_tok.span.hi() == lt_span.lo() {
let eq_lt = maybe_eq_tok.span.to(lt_span);
err.span_suggestion(eq_lt, "did you mean", "<=", Applicability::Unspecified);
}
err
})?;
(Some(qself), path)
} else {
(None, self.parse_path(PathStyle::Expr)?)
Expand Down
33 changes: 33 additions & 0 deletions tests/ui/parser/eq-less-to-less-eq.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
fn foo() {
let a = 0;
let b = 4;
if a =< b { //~ERROR
println!("yay!");
}
}

fn bar() {
let a = 0;
let b = 4;
if a = <b { //~ERROR
println!("yay!");
}
}

fn baz() {
let a = 0;
let b = 4;
if a = < b { //~ERROR
println!("yay!");
}
}

fn qux() {
let a = 0;
let b = 4;
if a =< i32>::abs(-4) { //~ERROR: mismatched types
println!("yay!");
}
}

fn main() {}
34 changes: 34 additions & 0 deletions tests/ui/parser/eq-less-to-less-eq.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
error: expected one of `!`, `(`, `+`, `::`, `<`, `>`, or `as`, found `{`
--> $DIR/eq-less-to-less-eq.rs:4:15
|
LL | if a =< b {
| -- ^ expected one of 7 possible tokens
| |
| help: did you mean: `<=`

error: expected one of `!`, `(`, `+`, `::`, `<`, `>`, or `as`, found `{`
--> $DIR/eq-less-to-less-eq.rs:12:15
|
LL | if a = <b {
| ^ expected one of 7 possible tokens

error: expected one of `!`, `(`, `+`, `::`, `<`, `>`, or `as`, found `{`
--> $DIR/eq-less-to-less-eq.rs:20:16
|
LL | if a = < b {
| ^ expected one of 7 possible tokens

error[E0308]: mismatched types
--> $DIR/eq-less-to-less-eq.rs:28:8
|
LL | if a =< i32>::abs(-4) {
| ^^^^^^^^^^^^^^^^^^ expected `bool`, found `()`
|
help: you might have meant to compare for equality
|
LL | if a ==< i32>::abs(-4) {
| +

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 83b29ec

Please sign in to comment.