about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--library/proc_macro/src/bridge/client.rs5
-rw-r--r--src/test/ui-fulldeps/auxiliary/proc-macro-panic.rs13
-rw-r--r--src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.rs17
-rw-r--r--src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.stderr10
4 files changed, 42 insertions, 3 deletions
diff --git a/library/proc_macro/src/bridge/client.rs b/library/proc_macro/src/bridge/client.rs
index 3d9016293b8..39daad4da12 100644
--- a/library/proc_macro/src/bridge/client.rs
+++ b/library/proc_macro/src/bridge/client.rs
@@ -305,6 +305,7 @@ impl Bridge<'_> {
     }
 
     fn enter<R>(self, f: impl FnOnce() -> R) -> R {
+        let force_show_panics = self.force_show_panics;
         // Hide the default panic output within `proc_macro` expansions.
         // NB. the server can't do this because it may use a different libstd.
         static HIDE_PANICS_DURING_EXPANSION: Once = Once::new();
@@ -313,9 +314,7 @@ impl Bridge<'_> {
             panic::set_hook(Box::new(move |info| {
                 let show = BridgeState::with(|state| match state {
                     BridgeState::NotConnected => true,
-                    // Something weird is going on, so don't suppress any backtraces
-                    BridgeState::InUse => true,
-                    BridgeState::Connected(bridge) => bridge.force_show_panics,
+                    BridgeState::Connected(_) | BridgeState::InUse => force_show_panics,
                 });
                 if show {
                     prev(info)
diff --git a/src/test/ui-fulldeps/auxiliary/proc-macro-panic.rs b/src/test/ui-fulldeps/auxiliary/proc-macro-panic.rs
new file mode 100644
index 00000000000..fc15bb9c59d
--- /dev/null
+++ b/src/test/ui-fulldeps/auxiliary/proc-macro-panic.rs
@@ -0,0 +1,13 @@
+// force-host
+// no-prefer-dynamic
+
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+use proc_macro::{TokenStream, Ident, Span};
+
+#[proc_macro]
+pub fn panic_in_libproc_macro(_: TokenStream) -> TokenStream {
+    Ident::new("", Span::call_site());
+    TokenStream::new()
+}
diff --git a/src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.rs b/src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.rs
new file mode 100644
index 00000000000..981abb4e2c4
--- /dev/null
+++ b/src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.rs
@@ -0,0 +1,17 @@
+// aux-build:proc-macro-panic.rs
+// edition:2018
+// ignore-stage1
+// only-linux
+//
+// FIXME: This should be a normal (stage1, all platforms) test in
+// src/test/ui/proc-macro once issue #59998 is fixed.
+
+// Regression test for issue #76270
+// Tests that we don't print an ICE message when a panic
+// occurs in libproc-macro (when `-Z proc-macro-backtrace` is not specified)
+
+extern crate proc_macro_panic;
+
+proc_macro_panic::panic_in_libproc_macro!(); //~ ERROR proc macro panicked
+
+fn main() {}
diff --git a/src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.stderr b/src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.stderr
new file mode 100644
index 00000000000..e472242ce4b
--- /dev/null
+++ b/src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.stderr
@@ -0,0 +1,10 @@
+error: proc macro panicked
+  --> $DIR/issue-76270-panic-in-libproc-macro.rs:15:1
+   |
+LL | proc_macro_panic::panic_in_libproc_macro!();
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = help: message: `""` is not a valid identifier
+
+error: aborting due to previous error
+