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