mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	 7ca4d1f6a1
			
		
	
	
		7ca4d1f6a1
		
	
	
	
	
		
			
			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|}
 | |
| 
 |