|  | // This demonstrated Issue #84561: function-like macros produce unintuitive coverage results. | 
|  |  | 
|  | //@ failure-status: 101 | 
|  | #[derive(PartialEq, Eq)] | 
|  | struct Foo(u32); | 
|  |  | 
|  | #[rustfmt::skip] | 
|  | fn test3() { | 
|  | let is_true = std::env::args().len() == 1; | 
|  | let bar = Foo(1); | 
|  | assert_eq!(bar, Foo(1)); | 
|  | let baz = Foo(0); | 
|  | assert_ne!(baz, Foo(1)); | 
|  | println!("{:?}", Foo(1)); | 
|  | println!("{:?}", bar); | 
|  | println!("{:?}", baz); | 
|  |  | 
|  | assert_eq!(Foo(1), Foo(1)); | 
|  | assert_ne!(Foo(0), Foo(1)); | 
|  | assert_eq!(Foo(2), Foo(2)); | 
|  | let bar = Foo(0); | 
|  | assert_ne!(bar, Foo(3)); | 
|  | assert_ne!(Foo(0), Foo(4)); | 
|  | assert_eq!(Foo(3), Foo(3), "with a message"); | 
|  | println!("{:?}", bar); | 
|  | println!("{:?}", Foo(1)); | 
|  |  | 
|  | assert_ne!(Foo(0), Foo(5), "{}", if is_true { "true message" } else { "false message" }); | 
|  | assert_ne!( | 
|  | Foo(0) | 
|  | , | 
|  | Foo(5) | 
|  | , | 
|  | "{}" | 
|  | , | 
|  | if | 
|  | is_true | 
|  | { | 
|  | "true message" | 
|  | } else { | 
|  | "false message" | 
|  | } | 
|  | ); | 
|  |  | 
|  | let is_true = std::env::args().len() == 1; | 
|  |  | 
|  | assert_eq!( | 
|  | Foo(1), | 
|  | Foo(1) | 
|  | ); | 
|  | assert_ne!( | 
|  | Foo(0), | 
|  | Foo(1) | 
|  | ); | 
|  | assert_eq!( | 
|  | Foo(2), | 
|  | Foo(2) | 
|  | ); | 
|  | let bar = Foo(1); | 
|  | assert_ne!( | 
|  | bar, | 
|  | Foo(3) | 
|  | ); | 
|  | if is_true { | 
|  | assert_ne!( | 
|  | Foo(0), | 
|  | Foo(4) | 
|  | ); | 
|  | } else { | 
|  | assert_eq!( | 
|  | Foo(3), | 
|  | Foo(3) | 
|  | ); | 
|  | } | 
|  | if is_true { | 
|  | assert_ne!( | 
|  | Foo(0), | 
|  | Foo(4), | 
|  | "with a message" | 
|  | ); | 
|  | } else { | 
|  | assert_eq!( | 
|  | Foo(3), | 
|  | Foo(3), | 
|  | "with a message" | 
|  | ); | 
|  | } | 
|  | assert_ne!( | 
|  | if is_true { | 
|  | Foo(0) | 
|  | } else { | 
|  | Foo(1) | 
|  | }, | 
|  | Foo(5) | 
|  | ); | 
|  | assert_ne!( | 
|  | Foo(5), | 
|  | if is_true { | 
|  | Foo(0) | 
|  | } else { | 
|  | Foo(1) | 
|  | } | 
|  | ); | 
|  | assert_ne!( | 
|  | if is_true { | 
|  | assert_eq!( | 
|  | Foo(3), | 
|  | Foo(3) | 
|  | ); | 
|  | Foo(0) | 
|  | } else { | 
|  | assert_ne!( | 
|  | if is_true { | 
|  | Foo(0) | 
|  | } else { | 
|  | Foo(1) | 
|  | }, | 
|  | Foo(5) | 
|  | ); | 
|  | Foo(1) | 
|  | }, | 
|  | Foo(5), | 
|  | "with a message" | 
|  | ); | 
|  | assert_eq!( | 
|  | Foo(1), | 
|  | Foo(3), | 
|  | "this assert should fail" | 
|  | ); | 
|  | assert_eq!( | 
|  | Foo(3), | 
|  | Foo(3), | 
|  | "this assert should not be reached" | 
|  | ); | 
|  | } | 
|  |  | 
|  | impl std::fmt::Debug for Foo { | 
|  | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | 
|  | write!(f, "try and succeed")?; | 
|  | Ok(()) | 
|  | } | 
|  | } | 
|  |  | 
|  | static mut DEBUG_LEVEL_ENABLED: bool = false; | 
|  |  | 
|  | macro_rules! debug { | 
|  | ($($arg:tt)+) => ( | 
|  | if unsafe { DEBUG_LEVEL_ENABLED } { | 
|  | println!($($arg)+); | 
|  | } | 
|  | ); | 
|  | } | 
|  |  | 
|  | fn test1() { | 
|  | debug!("debug is enabled"); | 
|  | debug!("debug is enabled"); | 
|  | let _ = 0; | 
|  | debug!("debug is enabled"); | 
|  | unsafe { | 
|  | DEBUG_LEVEL_ENABLED = true; | 
|  | } | 
|  | debug!("debug is enabled"); | 
|  | } | 
|  |  | 
|  | macro_rules! call_debug { | 
|  | ($($arg:tt)+) => ( | 
|  | fn call_print(s: &str) { | 
|  | print!("{}", s); | 
|  | } | 
|  |  | 
|  | call_print("called from call_debug: "); | 
|  | debug!($($arg)+); | 
|  | ); | 
|  | } | 
|  |  | 
|  | fn test2() { | 
|  | call_debug!("debug is enabled"); | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | test1(); | 
|  | test2(); | 
|  | test3(); | 
|  | } |