2021-04-26 18:27:54 -05:00
|
|
|
1| |// This demonstrated Issue #84561: function-like macros produce unintuitive coverage results.
|
|
|
|
2| |
|
|
|
|
3| |// expect-exit-status-101
|
|
|
|
4| 21|#[derive(PartialEq, Eq)]
|
2021-04-26 04:45:46 -05:00
|
|
|
5| |struct Foo(u32);
|
2021-04-27 23:45:30 -05:00
|
|
|
6| 1|fn test3() {
|
2021-04-26 18:27:54 -05:00
|
|
|
7| 1| let is_true = std::env::args().len() == 1;
|
2021-04-26 04:45:46 -05:00
|
|
|
8| 1| let bar = Foo(1);
|
|
|
|
9| 1| assert_eq!(bar, Foo(1));
|
|
|
|
10| 1| let baz = Foo(0);
|
|
|
|
11| 1| assert_ne!(baz, Foo(1));
|
|
|
|
12| 1| println!("{:?}", Foo(1));
|
|
|
|
13| 1| println!("{:?}", bar);
|
|
|
|
14| 1| println!("{:?}", baz);
|
|
|
|
15| 1|
|
|
|
|
16| 1| assert_eq!(Foo(1), Foo(1));
|
|
|
|
17| 1| assert_ne!(Foo(0), Foo(1));
|
|
|
|
18| 1| assert_eq!(Foo(2), Foo(2));
|
2021-04-26 18:27:54 -05:00
|
|
|
19| 1| let bar = Foo(0);
|
|
|
|
20| 1| assert_ne!(bar, Foo(3));
|
2021-04-26 04:45:46 -05:00
|
|
|
21| 1| assert_ne!(Foo(0), Foo(4));
|
2021-04-26 18:27:54 -05:00
|
|
|
22| 1| assert_eq!(Foo(3), Foo(3), "with a message");
|
|
|
|
^0
|
|
|
|
23| 1| println!("{:?}", bar);
|
|
|
|
24| 1| println!("{:?}", Foo(1));
|
|
|
|
25| 1|
|
|
|
|
26| 1| assert_ne!(Foo(0), Foo(5), "{}", if is_true { "true message" } else { "false message" });
|
2021-09-22 11:48:01 -05:00
|
|
|
^0 ^0 ^0
|
2021-04-26 18:27:54 -05:00
|
|
|
27| 1| assert_ne!(
|
|
|
|
28| | Foo(0)
|
|
|
|
29| | ,
|
|
|
|
30| | Foo(5)
|
|
|
|
31| | ,
|
|
|
|
32| 0| "{}"
|
2021-09-22 11:48:01 -05:00
|
|
|
33| 0| ,
|
|
|
|
34| 0| if
|
2021-04-26 18:27:54 -05:00
|
|
|
35| 0| is_true
|
|
|
|
36| | {
|
|
|
|
37| 0| "true message"
|
|
|
|
38| | } else {
|
|
|
|
39| 0| "false message"
|
|
|
|
40| | }
|
|
|
|
41| | );
|
|
|
|
42| |
|
|
|
|
43| 1| let is_true = std::env::args().len() == 1;
|
|
|
|
44| 1|
|
|
|
|
45| 1| assert_eq!(
|
|
|
|
46| 1| Foo(1),
|
|
|
|
47| 1| Foo(1)
|
|
|
|
48| 1| );
|
|
|
|
49| 1| assert_ne!(
|
|
|
|
50| 1| Foo(0),
|
|
|
|
51| 1| Foo(1)
|
|
|
|
52| 1| );
|
|
|
|
53| 1| assert_eq!(
|
|
|
|
54| 1| Foo(2),
|
|
|
|
55| 1| Foo(2)
|
|
|
|
56| 1| );
|
|
|
|
57| 1| let bar = Foo(1);
|
|
|
|
58| 1| assert_ne!(
|
|
|
|
59| 1| bar,
|
|
|
|
60| 1| Foo(3)
|
|
|
|
61| 1| );
|
|
|
|
62| 1| if is_true {
|
|
|
|
63| 1| assert_ne!(
|
|
|
|
64| 1| Foo(0),
|
|
|
|
65| 1| Foo(4)
|
|
|
|
66| 1| );
|
|
|
|
67| | } else {
|
|
|
|
68| 0| assert_eq!(
|
|
|
|
69| 0| Foo(3),
|
|
|
|
70| 0| Foo(3)
|
|
|
|
71| 0| );
|
|
|
|
72| | }
|
|
|
|
73| 1| if is_true {
|
|
|
|
74| 1| assert_ne!(
|
|
|
|
75| | Foo(0),
|
|
|
|
76| | Foo(4),
|
|
|
|
77| 0| "with a message"
|
|
|
|
78| | );
|
|
|
|
79| | } else {
|
|
|
|
80| 0| assert_eq!(
|
|
|
|
81| | Foo(3),
|
|
|
|
82| | Foo(3),
|
|
|
|
83| 0| "with a message"
|
|
|
|
84| | );
|
|
|
|
85| | }
|
|
|
|
86| 1| assert_ne!(
|
|
|
|
87| 1| if is_true {
|
|
|
|
88| 1| Foo(0)
|
|
|
|
89| | } else {
|
2021-04-26 04:45:46 -05:00
|
|
|
90| 0| Foo(1)
|
|
|
|
91| | },
|
|
|
|
92| | Foo(5)
|
|
|
|
93| | );
|
2021-04-26 18:27:54 -05:00
|
|
|
94| 1| assert_ne!(
|
|
|
|
95| 1| Foo(5),
|
|
|
|
96| 1| if is_true {
|
|
|
|
97| 1| Foo(0)
|
|
|
|
98| | } else {
|
|
|
|
99| 0| Foo(1)
|
|
|
|
100| | }
|
|
|
|
101| | );
|
|
|
|
102| 1| assert_ne!(
|
|
|
|
103| 1| if is_true {
|
|
|
|
104| 1| assert_eq!(
|
|
|
|
105| 1| Foo(3),
|
|
|
|
106| 1| Foo(3)
|
|
|
|
107| 1| );
|
|
|
|
108| 1| Foo(0)
|
|
|
|
109| | } else {
|
|
|
|
110| 0| assert_ne!(
|
|
|
|
111| 0| if is_true {
|
|
|
|
112| 0| Foo(0)
|
|
|
|
113| | } else {
|
|
|
|
114| 0| Foo(1)
|
|
|
|
115| | },
|
|
|
|
116| | Foo(5)
|
|
|
|
117| | );
|
|
|
|
118| 0| Foo(1)
|
|
|
|
119| | },
|
|
|
|
120| | Foo(5),
|
|
|
|
121| 0| "with a message"
|
|
|
|
122| | );
|
|
|
|
123| 1| assert_eq!(
|
|
|
|
124| | Foo(1),
|
|
|
|
125| | Foo(3),
|
|
|
|
126| 1| "this assert should fail"
|
|
|
|
127| | );
|
|
|
|
128| 0| assert_eq!(
|
|
|
|
129| | Foo(3),
|
|
|
|
130| | Foo(3),
|
|
|
|
131| 0| "this assert should not be reached"
|
|
|
|
132| | );
|
|
|
|
133| 0|}
|
|
|
|
134| |
|
|
|
|
135| |impl std::fmt::Debug for Foo {
|
|
|
|
136| | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
2023-04-21 11:29:55 -05:00
|
|
|
137| 9| write!(f, "try and succeed")?;
|
2021-04-26 18:27:54 -05:00
|
|
|
^0
|
2023-04-21 11:29:55 -05:00
|
|
|
138| 9| Ok(())
|
|
|
|
139| 9| }
|
2021-04-26 18:27:54 -05:00
|
|
|
140| |}
|
|
|
|
141| |
|
|
|
|
142| |static mut DEBUG_LEVEL_ENABLED: bool = false;
|
|
|
|
143| |
|
|
|
|
144| |macro_rules! debug {
|
|
|
|
145| | ($($arg:tt)+) => (
|
|
|
|
146| | if unsafe { DEBUG_LEVEL_ENABLED } {
|
|
|
|
147| | println!($($arg)+);
|
|
|
|
148| | }
|
|
|
|
149| | );
|
|
|
|
150| |}
|
|
|
|
151| |
|
|
|
|
152| 1|fn test1() {
|
|
|
|
153| 1| debug!("debug is enabled");
|
|
|
|
^0
|
|
|
|
154| 1| debug!("debug is enabled");
|
|
|
|
^0
|
|
|
|
155| 1| let _ = 0;
|
|
|
|
156| 1| debug!("debug is enabled");
|
|
|
|
^0
|
|
|
|
157| 1| unsafe {
|
|
|
|
158| 1| DEBUG_LEVEL_ENABLED = true;
|
|
|
|
159| 1| }
|
|
|
|
160| 1| debug!("debug is enabled");
|
|
|
|
161| 1|}
|
|
|
|
162| |
|
2021-04-27 23:45:30 -05:00
|
|
|
163| |macro_rules! call_debug {
|
|
|
|
164| | ($($arg:tt)+) => (
|
|
|
|
165| 1| fn call_print(s: &str) {
|
|
|
|
166| 1| print!("{}", s);
|
|
|
|
167| 1| }
|
|
|
|
168| |
|
|
|
|
169| | call_print("called from call_debug: ");
|
|
|
|
170| | debug!($($arg)+);
|
|
|
|
171| | );
|
|
|
|
172| |}
|
|
|
|
173| |
|
|
|
|
174| 1|fn test2() {
|
|
|
|
175| 1| call_debug!("debug is enabled");
|
|
|
|
176| 1|}
|
|
|
|
177| |
|
|
|
|
178| 1|fn main() {
|
|
|
|
179| 1| test1();
|
|
|
|
180| 1| test2();
|
|
|
|
181| 1| test3();
|
|
|
|
182| 1|}
|
2021-04-26 04:45:46 -05:00
|
|
|
|