-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve error msgs when found type is deref of expected
This improves help messages in two cases: - When expected type is `T` and found type is `&T`, we now look through blocks and suggest dereferencing the expression of the block, rather than the whole block. - In the above case, if the expression is an `&`, we not suggest removing the `&` instead of adding `*`. Both of these are demonstrated in the regression test. Before this patch the first error in the test would be: error[E0308]: `if` and `else` have incompatible types --> test.rs:8:9 | 5 | / if true { 6 | | a | | - expected because of this 7 | | } else { 8 | | b | | ^ expected `usize`, found `&usize` 9 | | }; | |_____- `if` and `else` have incompatible types | help: consider dereferencing the borrow | 7 | } else *{ 8 | b 9 | }; | Now: error[E0308]: `if` and `else` have incompatible types --> test.rs:8:9 | 5 | / if true { 6 | | a | | - expected because of this 7 | | } else { 8 | | b | | ^ | | | | | expected `usize`, found `&usize` | | help: consider dereferencing the borrow: `*b` 9 | | }; | |_____- `if` and `else` have incompatible types The second error: error[E0308]: `if` and `else` have incompatible types --> test.rs:14:9 | 11 | / if true { 12 | | 1 | | - expected because of this 13 | | } else { 14 | | &1 | | ^^ expected integer, found `&{integer}` 15 | | }; | |_____- `if` and `else` have incompatible types | help: consider dereferencing the borrow | 13 | } else *{ 14 | &1 15 | }; | now: error[E0308]: `if` and `else` have incompatible types --> test.rs:14:9 | 11 | / if true { 12 | | 1 | | - expected because of this 13 | | } else { 14 | | &1 | | ^- | | || | | |help: consider removing the `&`: `1` | | expected integer, found `&{integer}` 15 | | }; | |_____- `if` and `else` have incompatible types Fixes #82361
- Loading branch information
Showing
5 changed files
with
128 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// run-rustfix | ||
|
||
fn main() { | ||
let a: usize = 123; | ||
let b: &usize = &a; | ||
|
||
if true { | ||
a | ||
} else { | ||
*b //~ ERROR `if` and `else` have incompatible types [E0308] | ||
}; | ||
|
||
if true { | ||
1 | ||
} else { | ||
1 //~ ERROR `if` and `else` have incompatible types [E0308] | ||
}; | ||
|
||
if true { | ||
1 | ||
} else { | ||
1 //~ ERROR `if` and `else` have incompatible types [E0308] | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// run-rustfix | ||
|
||
fn main() { | ||
let a: usize = 123; | ||
let b: &usize = &a; | ||
|
||
if true { | ||
a | ||
} else { | ||
b //~ ERROR `if` and `else` have incompatible types [E0308] | ||
}; | ||
|
||
if true { | ||
1 | ||
} else { | ||
&1 //~ ERROR `if` and `else` have incompatible types [E0308] | ||
}; | ||
|
||
if true { | ||
1 | ||
} else { | ||
&mut 1 //~ ERROR `if` and `else` have incompatible types [E0308] | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
error[E0308]: `if` and `else` have incompatible types | ||
--> $DIR/issue-82361.rs:10:9 | ||
| | ||
LL | / if true { | ||
LL | | a | ||
| | - expected because of this | ||
LL | | } else { | ||
LL | | b | ||
| | ^ | ||
| | | | ||
| | expected `usize`, found `&usize` | ||
| | help: consider dereferencing the borrow: `*b` | ||
LL | | }; | ||
| |_____- `if` and `else` have incompatible types | ||
|
||
error[E0308]: `if` and `else` have incompatible types | ||
--> $DIR/issue-82361.rs:16:9 | ||
| | ||
LL | / if true { | ||
LL | | 1 | ||
| | - expected because of this | ||
LL | | } else { | ||
LL | | &1 | ||
| | -^ | ||
| | | | ||
| | expected integer, found `&{integer}` | ||
| | help: consider removing the `&` | ||
LL | | }; | ||
| |_____- `if` and `else` have incompatible types | ||
|
||
error[E0308]: `if` and `else` have incompatible types | ||
--> $DIR/issue-82361.rs:22:9 | ||
| | ||
LL | / if true { | ||
LL | | 1 | ||
| | - expected because of this | ||
LL | | } else { | ||
LL | | &mut 1 | ||
| | -----^ | ||
| | | | ||
| | expected integer, found `&mut {integer}` | ||
| | help: consider removing the `&mut` | ||
LL | | }; | ||
| |_____- `if` and `else` have incompatible types | ||
|
||
error: aborting due to 3 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0308`. |