From 53cce257aebe822735ed9eecde152d928a3e7378 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Thu, 3 Sep 2020 12:11:18 -0400 Subject: [PATCH] Respect `-Z proc-macro-backtrace` flag for panics inside libproc_macro Fixes #76270 Previously, any panic occuring during a call to a libproc_macro method (e.g. calling `Ident::new` with an invalid identifier) would always cause an ICE message to be printed. --- library/proc_macro/src/bridge/client.rs | 5 ++--- .../ui-fulldeps/auxiliary/proc-macro-panic.rs | 13 +++++++++++++ .../issue-76270-panic-in-libproc-macro.rs | 17 +++++++++++++++++ .../issue-76270-panic-in-libproc-macro.stderr | 10 ++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/test/ui-fulldeps/auxiliary/proc-macro-panic.rs create mode 100644 src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.rs create mode 100644 src/test/ui-fulldeps/issue-76270-panic-in-libproc-macro.stderr 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(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 +