aboutsummaryrefslogtreecommitdiff
path: root/gdb/rust-lang.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-02-09 12:12:42 -0700
committerTom Tromey <tom@tromey.com>2023-02-27 11:12:11 -0700
commitdebd0556e519c3d258299cf5f14a44cc01c795da (patch)
tree31de598b7d1f797a7813b74485c56db5379ef3c8 /gdb/rust-lang.c
parent810fbe39b2712853d08df74469f373254b5f30cc (diff)
downloadgdb-debd0556e519c3d258299cf5f14a44cc01c795da.zip
gdb-debd0556e519c3d258299cf5f14a44cc01c795da.tar.gz
gdb-debd0556e519c3d258299cf5f14a44cc01c795da.tar.bz2
Fix crash with "finish" in Rust
PR rust/30090 points out that a certain "finish" in a Rust program will cause gdb to crash. This happens due to some confusion about field indices in rust_language::print_enum. The fix is to use value_primitive_field so that the correct type can be passed; other spots in rust-lang.c already do this. Note that the enclosed test case comes with an xfail. This is needed because for this function, rustc doesn't follow the platform ABI. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30090
Diffstat (limited to 'gdb/rust-lang.c')
-rw-r--r--gdb/rust-lang.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index fe260f1..6fc73b2 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -470,7 +470,7 @@ rust_language::print_enum (struct value *val, struct ui_file *stream,
}
int variant_fieldno = rust_enum_variant (type);
- val = value_field (val, variant_fieldno);
+ val = val->primitive_field (0, variant_fieldno, type);
struct type *variant_type = type->field (variant_fieldno).type ();
int nfields = variant_type->num_fields ();