LL| |//! Regression test for <https://github.com/rust-lang/rust/issues/141577>. | |
LL| |//! | |
LL| |//! The changes in <https://github.com/rust-lang/rust/pull/144298> exposed a | |
LL| |//! latent bug that would sometimes cause the compiler to emit a covfun record | |
LL| |//! for a function, but not emit a corresponding PGO symbol name entry, because | |
LL| |//! the function did not have any physical coverage counters. The `llvm-cov` | |
LL| |//! tool would then fail to resolve the covfun record's function name hash, | |
LL| |//! and exit with the cryptic error: | |
LL| |//! | |
LL| |//! ```text | |
LL| |//! malformed instrumentation profile data: function name is empty | |
LL| |//! ``` | |
LL| |//! | |
LL| |//! The bug was then triggered in the wild by the macro-expansion of | |
LL| |//! `#[derive(arbitrary::Arbitrary)]`. | |
LL| |//! | |
LL| |//! This test uses a minimized form of the `Arbitrary` derive macro that was | |
LL| |//! found to still trigger the original bug. The bug could also be triggered | |
LL| |//! by a bang proc-macro or an attribute proc-macro. | |
LL| | | |
LL| |//@ edition: 2024 | |
LL| |//@ revisions: attr bang derive | |
LL| |//@ proc-macro: try_in_macro_helper.rs | |
LL| | | |
LL| |trait Arbitrary { | |
LL| | fn try_size_hint() -> Option<usize>; | |
LL| |} | |
LL| | | |
LL| |// Expand via an attribute proc-macro. | |
LL| |#[cfg_attr(attr, try_in_macro_helper::attr)] | |
LL| |const _: () = (); | |
LL| | | |
LL| |// Expand via a regular bang-style proc-macro. | |
LL| |#[cfg(bang)] | |
LL| |try_in_macro_helper::bang!(); | |
LL| | | |
LL| |// Expand via a derive proc-macro. | |
LL| |#[cfg_attr(derive, derive(try_in_macro_helper::Arbitrary))] | |
LL| |enum MyEnum {} | |
LL| | | |
LL| 1|fn main() { | |
LL| 1| MyEnum::try_size_hint(); | |
LL| 1|} | |