| //! This tests that `next` skips over macro invocations correctly. | |
| //! The `#locN` markers have no meaning for compiletest, we include them just | |
| //! so that the debugger prints them when printing the current source location, | |
| //! and we can match on them for testing purposes. | |
| //@ ignore-android | |
| // LLDB 1800+ tests were not tested in CI, broke, and now are disabled | |
| //@ ignore-lldb | |
| //@ min-gdb-version: 13.0 | |
| //@ aux-build:macro-stepping.rs | |
| #![allow(unused)] | |
| #[macro_use] | |
| extern crate macro_stepping; // exports new_scope!() | |
| //@ compile-flags: -g | |
| // See explanation in `tests/debuginfo/basic-stepping.rs`. | |
| //@ revisions: opt-level-0 maximally-steppable | |
| //@ [maximally-steppable] compile-flags: -Zmir-enable-passes=-SingleUseConsts | |
| // === GDB TESTS =================================================================================== | |
| //@ gdb-command:run | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#loc1[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#loc2[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#loc3[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#loc4[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#loc5[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#loc6[...] | |
| //@ gdb-command:continue | |
| //@ gdb-command:step | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#inc-loc1[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ gdb-check:[...]#inc-loc2[...] | |
| //@ gdb-command:next | |
| //@ gdb-command:frame | |
| //@ [maximally-steppable] gdb-check:[...]#inc-loc3[...] | |
| // === LLDB TESTS ================================================================================== | |
| //@ lldb-command:set set stop-line-count-before 0 | |
| //@ lldb-command:set set stop-line-count-after 1 | |
| // Can't set both to zero or lldb will stop printing source at all. So it will output the current | |
| // line and the next. We deal with this by having at least 2 lines between the #loc's | |
| //@ lldb-command:run | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #loc1 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #loc2 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #loc3 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #loc4 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #loc5 [...] | |
| // FIXME: what about loc6? | |
| //@ lldb-command:continue | |
| //@ lldb-command:step | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #inc-loc1 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #inc-loc2 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #inc-loc1 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #inc-loc2 [...] | |
| //@ lldb-command:next | |
| //@ lldb-command:frame select | |
| //@ lldb-check:[...] #inc-loc3 [...] | |
| #[collapse_debuginfo(yes)] | |
| macro_rules! foo { | |
| () => { | |
| let a = 1; opaque(a); | |
| let b = 2; opaque(b); | |
| let c = 3; opaque(c); | |
| }; | |
| } | |
| #[collapse_debuginfo(yes)] | |
| macro_rules! foo2 { | |
| () => { | |
| foo!(); | |
| let x = 1; opaque(x); | |
| foo!(); | |
| }; | |
| } | |
| fn main() { | |
| zzz(); // #break | |
| foo!(); // #loc1 | |
| foo2!(); // #loc2 | |
| let x = vec![42]; // #loc3 | |
| new_scope!(); // #loc4 | |
| println!("Hello {}", // #loc5 | |
| "world"); | |
| zzz(); // #loc6 | |
| included(); // #break | |
| } | |
| fn zzz() {()} | |
| fn opaque(_: u32) {} | |
| include!("macro-stepping.inc"); |