Auto merge of #42649 - estebank:if-cond, r=nikomatsakis
Report error for assignment in `if` condition
For code like `if x = 3 {}`, output:
```
error[E0308]: mismatched types
--> $DIR/issue-17283.rs:25:8
|
25 | if x = x {
| ^^^^^
| |
| help: did you mean to compare equality? `x == x`
| expected bool, found ()
|
= note: expected type `bool`
found type `()`
```
Fix #40926.
This commit is contained in:
commit
78d8416caf
5 changed files with 145 additions and 37 deletions
|
|
@ -24,25 +24,29 @@ fn main() {
|
|||
// `x { ... }` should not be interpreted as a struct literal here
|
||||
if x = x {
|
||||
//~^ ERROR mismatched types
|
||||
//~| expected type `bool`
|
||||
//~| found type `()`
|
||||
//~| expected bool, found ()
|
||||
//~| HELP did you mean to compare equality?
|
||||
println!("{}", x);
|
||||
}
|
||||
// Explicit parentheses on the left should match behavior of above
|
||||
if (x = x) {
|
||||
//~^ ERROR mismatched types
|
||||
//~| expected type `bool`
|
||||
//~| found type `()`
|
||||
//~| expected bool, found ()
|
||||
//~| HELP did you mean to compare equality?
|
||||
println!("{}", x);
|
||||
}
|
||||
// The struct literal interpretation is fine with explicit parentheses on the right
|
||||
if y = (Foo { foo: x }) {
|
||||
//~^ ERROR mismatched types
|
||||
//~| expected type `bool`
|
||||
//~| found type `()`
|
||||
//~| expected bool, found ()
|
||||
//~| HELP did you mean to compare equality?
|
||||
println!("{}", x);
|
||||
}
|
||||
// "invalid left-hand side expression" error is suppresed
|
||||
if 3 = x {
|
||||
//~^ ERROR mismatched types
|
||||
//~| HELP did you mean to compare equality?
|
||||
println!("{}", x);
|
||||
}
|
||||
if (if true { x = 4 } else { x = 5 }) {
|
||||
//~^ ERROR mismatched types
|
||||
println!("{}", x);
|
||||
}
|
||||
}
|
||||
59
src/test/ui/type-check/assignment-in-if.stderr
Normal file
59
src/test/ui/type-check/assignment-in-if.stderr
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/assignment-in-if.rs:25:8
|
||||
|
|
||||
25 | if x = x {
|
||||
| ^^^^^
|
||||
| |
|
||||
| help: did you mean to compare equality? `x == x`
|
||||
| expected bool, found ()
|
||||
|
|
||||
= note: expected type `bool`
|
||||
found type `()`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/assignment-in-if.rs:31:8
|
||||
|
|
||||
31 | if (x = x) {
|
||||
| ^^^^^^^
|
||||
| |
|
||||
| help: did you mean to compare equality? `x == x`
|
||||
| expected bool, found ()
|
||||
|
|
||||
= note: expected type `bool`
|
||||
found type `()`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/assignment-in-if.rs:37:8
|
||||
|
|
||||
37 | if y = (Foo { foo: x }) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: did you mean to compare equality? `y == (Foo { foo: x })`
|
||||
| expected bool, found ()
|
||||
|
|
||||
= note: expected type `bool`
|
||||
found type `()`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/assignment-in-if.rs:43:8
|
||||
|
|
||||
43 | if 3 = x {
|
||||
| ^^^^^
|
||||
| |
|
||||
| help: did you mean to compare equality? `3 == x`
|
||||
| expected bool, found ()
|
||||
|
|
||||
= note: expected type `bool`
|
||||
found type `()`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/assignment-in-if.rs:48:8
|
||||
|
|
||||
48 | if (if true { x = 4 } else { x = 5 }) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found ()
|
||||
|
|
||||
= note: expected type `bool`
|
||||
found type `()`
|
||||
|
||||
error: aborting due to previous error(s)
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue