mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-03 18:57:19 +00:00

The bug was triggered by a particular usage of the `?` try operator in a proc-macro expansion. Thanks to lqd for the minimization. Co-authored-by: Rémy Rakic <remy.rakic+github@gmail.com>
45 lines
2.0 KiB
Plaintext
45 lines
2.0 KiB
Plaintext
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|}
|
|
|