// compile-flags:-g

// We only test Rust-aware versions of GDB:
// min-gdb-version: 8.2

// === GDB TESTS ===================================================================================

// gdb-command: run

// gdb-command: print _ref
// gdb-check: $1 = (*mut ()) 0x[...]

// gdb-command: print _ptr
// gdb-check: $2 = (*mut ()) 0x[...]

// gdb-command: print _local
// gdb-check: $3 = ()

// gdb-command: print _field
// gdb-check: $4 = unit_type::_TypeContainingUnitField {_a: 123, _unit: (), _b: 456}

// Check that we can cast "void pointers" to their actual type in the debugger
// gdb-command: print /x *(_ptr as *const u64)
// gdb-check: $5 = 0x1122334455667788

// === CDB TESTS ===================================================================================

// cdb-command: g
// cdb-check: Breakpoint 0 hit

// cdb-command: dx _ref
// cdb-check: _ref             : 0x[...] : () [Type: tuple$<> *]

// cdb-command: dx _ptr
// cdb-check: _ptr             : 0x[...] : () [Type: tuple$<> *]

// cdb-command: dx _local
// cdb-check: _local           : () [Type: tuple$<>]

// cdb-command: dx _field,d
// cdb-check: _field,d         [Type: unit_type::_TypeContainingUnitField]
// cdb-check:     [+0x[...]] _a               : 123 [Type: unsigned int]
// cdb-check:     [+0x[...]] _unit            : () [Type: tuple$<>]
// cdb-check:     [+0x[...]] _b               : 456 [Type: unsigned __int64]

// Check that we can cast "void pointers" to their actual type in the debugger
// cdb-command: dx ((__int64 *)_ptr),x
// cdb-check: ((__int64 *)_ptr),x : 0x[...] : 0x1122334455667788 [Type: __int64 *]
// cdb-check:     0x1122334455667788 [Type: __int64]

struct _TypeContainingUnitField {
    _a: u32,
    _unit: (),
    _b: u64,
}

fn foo(_ref: &(), _ptr: *const ()) {
    let _local = ();
    let _field = _TypeContainingUnitField { _a: 123, _unit: (), _b: 456 };

    zzz(); // #break
}

fn main() {
    let pointee = 0x1122_3344_5566_7788i64;

    foo(&(), &pointee as *const i64 as *const ());
}

#[inline(never)]
fn zzz() {}
