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