about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_parse/src/parser/item.rs46
-rw-r--r--src/test/ui/proc-macro/auxiliary/issue-91800-macro.rs26
-rw-r--r--src/test/ui/proc-macro/issue-91800.rs16
-rw-r--r--src/test/ui/proc-macro/issue-91800.stderr56
4 files changed, 123 insertions, 21 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs
index 1d50ce767af..bf685aa8cad 100644
--- a/compiler/rustc_parse/src/parser/item.rs
+++ b/compiler/rustc_parse/src/parser/item.rs
@@ -1775,30 +1775,34 @@ impl<'a> Parser<'a> {
             span,
             "macros that expand to items must be delimited with braces or followed by a semicolon",
         );
-        if self.unclosed_delims.is_empty() {
-            let DelimSpan { open, close } = match args {
-                MacArgs::Empty | MacArgs::Eq(..) => unreachable!(),
-                MacArgs::Delimited(dspan, ..) => *dspan,
-            };
-            err.multipart_suggestion(
-                "change the delimiters to curly braces",
-                vec![(open, "{".to_string()), (close, '}'.to_string())],
-                Applicability::MaybeIncorrect,
-            );
-        } else {
+        // FIXME: This will make us not emit the help even for declarative
+        // macros within the same crate (that we can fix), which is sad.
+        if !span.from_expansion() {
+            if self.unclosed_delims.is_empty() {
+                let DelimSpan { open, close } = match args {
+                    MacArgs::Empty | MacArgs::Eq(..) => unreachable!(),
+                    MacArgs::Delimited(dspan, ..) => *dspan,
+                };
+                err.multipart_suggestion(
+                    "change the delimiters to curly braces",
+                    vec![(open, "{".to_string()), (close, '}'.to_string())],
+                    Applicability::MaybeIncorrect,
+                );
+            } else {
+                err.span_suggestion(
+                    span,
+                    "change the delimiters to curly braces",
+                    " { /* items */ }",
+                    Applicability::HasPlaceholders,
+                );
+            }
             err.span_suggestion(
-                span,
-                "change the delimiters to curly braces",
-                " { /* items */ }",
-                Applicability::HasPlaceholders,
+                span.shrink_to_hi(),
+                "add a semicolon",
+                ';',
+                Applicability::MaybeIncorrect,
             );
         }
-        err.span_suggestion(
-            span.shrink_to_hi(),
-            "add a semicolon",
-            ';',
-            Applicability::MaybeIncorrect,
-        );
         err.emit();
     }
 
diff --git a/src/test/ui/proc-macro/auxiliary/issue-91800-macro.rs b/src/test/ui/proc-macro/auxiliary/issue-91800-macro.rs
new file mode 100644
index 00000000000..958a8bed9e2
--- /dev/null
+++ b/src/test/ui/proc-macro/auxiliary/issue-91800-macro.rs
@@ -0,0 +1,26 @@
+// force-host
+// no-prefer-dynamic
+
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+
+use proc_macro::TokenStream;
+
+fn compile_error() -> TokenStream {
+    r#"compile_error!("")"#.parse().unwrap()
+}
+
+#[proc_macro_derive(MyTrait)]
+pub fn derive(input: TokenStream) -> TokenStream {
+    compile_error()
+}
+#[proc_macro_attribute]
+pub fn attribute_macro(_attr: TokenStream, mut input: TokenStream) -> TokenStream {
+    input.extend(compile_error());
+    input
+}
+#[proc_macro]
+pub fn fn_macro(_item: TokenStream) -> TokenStream {
+    compile_error()
+}
diff --git a/src/test/ui/proc-macro/issue-91800.rs b/src/test/ui/proc-macro/issue-91800.rs
new file mode 100644
index 00000000000..0c1281de4f8
--- /dev/null
+++ b/src/test/ui/proc-macro/issue-91800.rs
@@ -0,0 +1,16 @@
+// aux-build: issue-91800-macro.rs
+
+#[macro_use]
+extern crate issue_91800_macro;
+
+#[derive(MyTrait)]
+//~^ ERROR macros that expand to items must be delimited with braces or followed by a semicolon
+//~| ERROR proc-macro derive produced unparseable tokens
+#[attribute_macro]
+//~^ ERROR macros that expand to items must be delimited with braces or followed by a semicolon
+struct MyStruct;
+
+fn_macro! {}
+//~^ ERROR macros that expand to items must be delimited with braces or followed by a semicolon
+
+fn main() {}
diff --git a/src/test/ui/proc-macro/issue-91800.stderr b/src/test/ui/proc-macro/issue-91800.stderr
new file mode 100644
index 00000000000..9c356263a36
--- /dev/null
+++ b/src/test/ui/proc-macro/issue-91800.stderr
@@ -0,0 +1,56 @@
+error: macros that expand to items must be delimited with braces or followed by a semicolon
+  --> $DIR/issue-91800.rs:6:10
+   |
+LL | #[derive(MyTrait)]
+   |          ^^^^^^^
+   |
+   = note: this error originates in the derive macro `MyTrait` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: proc-macro derive produced unparseable tokens
+  --> $DIR/issue-91800.rs:6:10
+   |
+LL | #[derive(MyTrait)]
+   |          ^^^^^^^
+
+error: 
+  --> $DIR/issue-91800.rs:6:10
+   |
+LL | #[derive(MyTrait)]
+   |          ^^^^^^^
+   |
+   = note: this error originates in the derive macro `MyTrait` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: macros that expand to items must be delimited with braces or followed by a semicolon
+  --> $DIR/issue-91800.rs:9:1
+   |
+LL | #[attribute_macro]
+   | ^^^^^^^^^^^^^^^^^^
+   |
+   = note: this error originates in the attribute macro `attribute_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: 
+  --> $DIR/issue-91800.rs:9:1
+   |
+LL | #[attribute_macro]
+   | ^^^^^^^^^^^^^^^^^^
+   |
+   = note: this error originates in the attribute macro `attribute_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: macros that expand to items must be delimited with braces or followed by a semicolon
+  --> $DIR/issue-91800.rs:13:1
+   |
+LL | fn_macro! {}
+   | ^^^^^^^^^^^^
+   |
+   = note: this error originates in the macro `fn_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: 
+  --> $DIR/issue-91800.rs:13:1
+   |
+LL | fn_macro! {}
+   | ^^^^^^^^^^^^
+   |
+   = note: this error originates in the macro `fn_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 7 previous errors
+