Closed
Description
When debugging the code from #41888 I noticed that this
fn main() {
let _ = g((0, 0));
}
type P = (u32, u8); // one field must be ≥u32, the other field must be ≥u8
type R = Result<(), P>;
#[allow(dead_code)]
enum X {
A(Box<X>),
B(Box<X>),
C, // B and C can be omitted, but they are added to ensure well-formed semantic
}
enum K {
D
}
enum E {
F(K), // must not be built-in type
#[allow(dead_code)]
G([X; 2]), // must present, can also be Vec<X> or (X, X), but not X or [X; 1] ...
}
fn g(mut pt: P) -> R {
let mut y = None;
loop {
let status = if pt.0 == 0 {
Some(E::F(K::D))
} else {
None
};
pt.0 = 1;
match status {
Some(infix_or_postfix) => {
if let E::F(_op) = infix_or_postfix { // <- must be captured by value
y = Some(pt);
Ok(())?; // <- yes this line is needed
}
}
_ => {
Err(y.unwrap())? // <-- must use `?`, return Err won't trigger segfault
}
}
}
}
when compiled with rustc test.rs -g -Copt-level=1
and run under gdb:
$ gdb test
GNU gdb (GDB) 7.12.1
(gdb) br test::g
Breakpoint 1 at 0x6b58: file /tmp/test.rs, line 36.
(gdb) r
Breakpoint 1, test::g (pt=<error reading variable: DWARF-2 expression error: `DW_OP_stack_value' operations must be used either alone or in conjunction with DW_OP_piece or DW_OP_bit_piece.>) at /tmp/test.rs:36
36 Some(infix_or_postfix) => {
Works fine in lldb, works fine without optimisation.