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