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