rust/tests/debuginfo/skip_second_statement.rs
Martin Nordholts 5b57d02e9f compiletest: Use //@ prefixes also for debuginfo test directives
So that when we later add support for revisions we can use the same
syntax for revisions as elsewhere.

This also prevents people from making typos for commands since
`src/tools/compiletest/src/directives/directive_names.rs` will catch such
typos now.

Note that we one FIXME for a non-trivial change for later:
```
// FIXME(148097): Change `// cdb-checksimple_closure` to `//@ cdb-check:simple_closure`
```
2025-11-25 06:13:45 +01:00

168 lines
4.5 KiB
Rust

//@ ignore-lldb
// Test that statement, skipped/added/reordered by macros, is correctly processed in debuginfo.
// Performed step-over and step-into debug stepping through call statements.
//@ compile-flags:-g -C collapse-macro-debuginfo=yes
//@ ignore-backends: gcc
// === GDB TESTS ===================================================================================
//@ gdb-command:run
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_rem1_call1[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_rem1_call3[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_rem2_call1[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call1[...]
//@ gdb-command:next 2
//@ gdb-check:[...]#loc_rem2_call3[...]
//@ gdb-command:step 2
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call3_println[...]
//@ gdb-command:next 3
//@ gdb-command:frame
//@ gdb-check:[...]#loc_after_rem[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_add1_call1[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_add1_hdr[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_add1_call3[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_add2_call1[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call1[...]
//@ gdb-command:next 2
//@ gdb-check:[...]#loc_add2_hdr[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call2[...]
//@ gdb-command:next 2
//@ gdb-command:frame
//@ gdb-check:[...]#loc_add2_call3[...]
//@ gdb-command:step 2
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call3_println[...]
//@ gdb-command:next 3
//@ gdb-command:frame
//@ gdb-check:[...]#loc_reorder1_call2[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_reorder1_call3[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_reorder1_call1[...]
//@ gdb-command:next
//@ gdb-command:frame
//@ gdb-check:[...]#loc_reorder2_call2[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call2[...]
//@ gdb-command:next 2
//@ gdb-command:frame
//@ gdb-check:[...]#loc_reorder2_call3[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call3[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call3_println[...]
//@ gdb-command:next 3
//@ gdb-command:frame
//@ gdb-check:[...]#loc_reorder2_call1[...]
//@ gdb-command:step
//@ gdb-command:frame
//@ gdb-check:[...]#loc_call1[...]
//@ gdb-command:next 2
//@ gdb-command:continue
#[inline(never)]
fn myprintln_impl(text: &str) {
println!("{}", text)
}
macro_rules! myprintln {
($($arg:tt)*) => {{
myprintln_impl($($arg)*);
}};
}
// Macro accepts 3 statements and removes the 2nd statement
macro_rules! remove_second_statement {
($s1:stmt; $s2:stmt; $s3:stmt;) => { $s1 $s3 }
}
macro_rules! add_second_statement {
($s1:stmt; $s3:stmt;) => {
$s1
call2(); // #loc_add_macro
$s3
}
}
macro_rules! reorder_statements {
($s1:stmt; $s2:stmt; $s3:stmt;) => { $s2 $s3 $s1 }
}
fn call1() {
myprintln!("one"); // #loc_call1
}
fn call2() {
myprintln!("two"); // #loc_call2
}
fn call3() {
(||{
myprintln!("three") // #loc_call3_println
})(); // #loc_call3
}
fn main() {
let ret = 0; // #break, step should go to call1
remove_second_statement! { // #loc_rem1_hdr
call1(); // #loc_rem1_call1, breakpoint should set to call1, step should go call3
call2(); // #loc_rem1_call2, breakpoint should set to call3
call3(); // #loc_rem1_call3
}
remove_second_statement! { // #loc_rem2_hdr
call1(); // #loc_rem2_call1, breakpoint should set to call1, step should go call3
call2(); // #loc_rem2_call2, breakpoint should set to call3
call3(); // #loc_rem2_call3, breakpoint should set to call3
}
myprintln!("After remove_second_statement test"); // #loc_after_rem
add_second_statement! { // #loc_add1_hdr
call1(); // #loc_add1_call1
call3(); // #loc_add1_call3
}
add_second_statement! { // #loc_add2_hdr
call1(); // #loc_add2_call1
call3(); // #loc_add2_call3
}
reorder_statements! { // #loc_reorder1_hdr
call1(); // #loc_reorder1_call1
call2(); // #loc_reorder1_call2
call3(); // #loc_reorder1_call3
}
reorder_statements! { // #loc_reorder2_hdr
call1(); // #loc_reorder2_call1
call2(); // #loc_reorder2_call2
call3(); // #loc_reorder2_call3
}
std::process::exit(ret); // #loc_exit
}