Files
Martin Nordholts 686ddd3e2e tests/debuginfo/basic-stepping.rs: Explain why all lines are not steppable
Some optimization passes _improve_ compile times [1]. So we want to run
some passes even with `-Copt-level=0`. That means that some of the lines
in the test can be optimized away. To make regression testing more
robust, we also want to run the test with such passes disabled. The
solution is to use two revisions. One with default `-Copt-level=0`
passes, and one "even less optimized", with enough optimization passes
disabled to keep the maximum number of lines steppable.

[1]: https://github.com/rust-lang/compiler-team/issues/319
2026-03-16 18:39:40 +01:00

140 lines
3.4 KiB
Rust

//! 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");