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:
bors 2017-06-17 16:54:07 +00:00
commit 78d8416caf
5 changed files with 145 additions and 37 deletions

View file

@ -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);
}
}

View 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)