Suggest replacing braces for brackets on array-esque invalid block expr

Newcomers may write `{1, 2, 3}` for making arrays, and the current error
message is not informative enough to quickly convince them what is
needed to fix the error.
This PR implements a diagnostic for this case, and its output looks like
this:
```text
error: this code is interpreted as a block expression, not an array
 --> src/lib.rs:1:22
  |
1 |   const FOO: [u8; 3] = {
  |  ______________________^
2 | |     1, 2, 3
3 | | };
  | |_^
  |
  = note: to define an array, one would use square brackets instead of curly braces
help: try using [] instead of {}
  |
1 | const FOO: [u8; 3] = [
2 |     1, 2, 3
3 | ];
  |
```

Fix #87672
This commit is contained in:
Hirochika Matsumoto 2021-08-07 04:34:29 +09:00
parent 8e398f5ba7
commit 21eff8f050
3 changed files with 120 additions and 4 deletions

View file

@ -0,0 +1,17 @@
fn main() {}
const FOO: [u8; 3] = { //~ ERROR this code is interpreted as a block expression
1, 2, 3
};
const BAR: [&str; 3] = {"one", "two", "three"};
//~^ ERROR this code is interpreted as a block expression
fn foo() {
{1, 2, 3};
//~^ ERROR this code is interpreted as a block expression
}
fn bar() {
1, 2, 3 //~ ERROR expected one of
}

View file

@ -0,0 +1,49 @@
error: this code is interpreted as a block expression, not an array
--> $DIR/issue-87830-try-brackets-for-arrays.rs:3:22
|
LL | const FOO: [u8; 3] = {
| ______________________^
LL | | 1, 2, 3
LL | | };
| |_^
|
= note: to define an array, one would use square brackets instead of curly braces
help: try using [] instead of {}
|
LL ~ const FOO: [u8; 3] = [
LL | 1, 2, 3
LL ~ ];
|
error: this code is interpreted as a block expression, not an array
--> $DIR/issue-87830-try-brackets-for-arrays.rs:7:24
|
LL | const BAR: [&str; 3] = {"one", "two", "three"};
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= note: to define an array, one would use square brackets instead of curly braces
help: try using [] instead of {}
|
LL | const BAR: [&str; 3] = ["one", "two", "three"];
| ~ ~
error: this code is interpreted as a block expression, not an array
--> $DIR/issue-87830-try-brackets-for-arrays.rs:11:5
|
LL | {1, 2, 3};
| ^^^^^^^^^
|
= note: to define an array, one would use square brackets instead of curly braces
help: try using [] instead of {}
|
LL | [1, 2, 3];
| ~ ~
error: expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
--> $DIR/issue-87830-try-brackets-for-arrays.rs:16:6
|
LL | 1, 2, 3
| ^ expected one of `.`, `;`, `?`, `}`, or an operator
error: aborting due to 4 previous errors