| //@ 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 | |
| } |