| // 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(); | |
| } |