From 5d4025bebbb59832052ddfc91dd80867128830d3 Mon Sep 17 00:00:00 2001 From: kadmin Date: Fri, 14 Jan 2022 06:06:21 +0000 Subject: [PATCH] Better diagnostic for const struct fields --- compiler/rustc_parse/src/parser/stmt.rs | 3 +++ src/test/ui/issues/issue-92776.rs | 23 +++++++++++++++++++++++ src/test/ui/issues/issue-92776.stderr | 22 ++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/test/ui/issues/issue-92776.rs create mode 100644 src/test/ui/issues/issue-92776.stderr diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs index d3e7d1690ccf6..90e2d1b55e57a 100644 --- a/compiler/rustc_parse/src/parser/stmt.rs +++ b/compiler/rustc_parse/src/parser/stmt.rs @@ -254,6 +254,9 @@ impl<'a> Parser<'a> { err.emit(); None } else { + if self.check(&token::Dot) { + err.help("if this was intended as a const argument, wrap it in curly braces: `{ ... }`"); + } // Rewind to before attempting to parse the type and continue parsing. let parser_snapshot_after_type = mem::replace(self, parser_snapshot_before_type); diff --git a/src/test/ui/issues/issue-92776.rs b/src/test/ui/issues/issue-92776.rs new file mode 100644 index 0000000000000..f9d942aa8db29 --- /dev/null +++ b/src/test/ui/issues/issue-92776.rs @@ -0,0 +1,23 @@ +struct Example { + foo: usize +} + +struct Example2(u32); + +const EXAMPLE: Example = Example { foo: 42 }; +const EXAMPLE_2: Example2 = Example2(42); + +struct Wow { + field: [u8; N] +} + + +fn a() { + let _a: Wow = Wow::new(); + //~^ ERROR expected one of +} + +fn main() { + let _b: Wow = Wow::new(); + //~^ ERROR expected one of +} diff --git a/src/test/ui/issues/issue-92776.stderr b/src/test/ui/issues/issue-92776.stderr new file mode 100644 index 0000000000000..e0a063cd3a368 --- /dev/null +++ b/src/test/ui/issues/issue-92776.stderr @@ -0,0 +1,22 @@ +error: expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, `=`, or `>`, found `.` + --> $DIR/issue-92776.rs:16:24 + | +LL | let _a: Wow = Wow::new(); + | -- ^ expected one of 9 possible tokens + | | + | while parsing the type for `_a` + | + = help: if this was intended as a const argument, wrap it in curly braces: `{ ... }` + +error: expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, `=`, or `>`, found `.` + --> $DIR/issue-92776.rs:21:26 + | +LL | let _b: Wow = Wow::new(); + | -- ^ expected one of 9 possible tokens + | | + | while parsing the type for `_b` + | + = help: if this was intended as a const argument, wrap it in curly braces: `{ ... }` + +error: aborting due to 2 previous errors +