Fix ptype of Rust slices

Something like "ptype &x[..]" (where "x" was a slice) would crash gdb.
rust_subscript wasn't handling slicing in the EVAL_AVOID_SIDE_EFFECTS
case.

2017-10-02  Tom Tromey  <tom@tromey.com>

	* rust-lang.c (rust_subscript): Handle slices in
	EVAL_AVOID_SIDE_EFFECTS case.

2017-10-02  Tom Tromey  <tom@tromey.com>

	* gdb.rust/simple.exp: Test ptype of a slice.
This commit is contained in:
Tom Tromey 2017-10-02 13:47:15 -06:00
parent 01af5e0d09
commit b3e3859bc5
4 changed files with 67 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2017-10-02 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_subscript): Handle slices in
EVAL_AVOID_SIDE_EFFECTS case.
2017-10-02 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_slice_type_p): Recognize &str as a slice type.

View File

@ -1456,17 +1456,53 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside,
else
low = value_as_long (rhs);
struct type *type = check_typedef (value_type (lhs));
if (noside == EVAL_AVOID_SIDE_EFFECTS)
{
struct type *type = check_typedef (value_type (lhs));
struct type *base_type = nullptr;
if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
base_type = TYPE_TARGET_TYPE (type);
else if (rust_slice_type_p (type))
{
for (int i = 0; i < TYPE_NFIELDS (type); ++i)
{
if (strcmp (TYPE_FIELD_NAME (type, i), "data_ptr") == 0)
{
base_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, i));
break;
}
}
if (base_type == nullptr)
error (_("Could not find 'data_ptr' in slice type"));
}
else if (TYPE_CODE (type) == TYPE_CODE_PTR)
base_type = TYPE_TARGET_TYPE (type);
else
error (_("Cannot subscript non-array type"));
result = value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (lhs));
struct type *new_type;
if (want_slice)
{
if (rust_slice_type_p (type))
new_type = type;
else
{
struct type *usize
= language_lookup_primitive_type (exp->language_defn,
exp->gdbarch,
"usize");
new_type = rust_slice_type ("&[*gdb*]", base_type, usize);
}
}
else
new_type = base_type;
return value_zero (new_type, VALUE_LVAL (lhs));
}
else
{
LONGEST low_bound;
struct value *base;
struct type *type = check_typedef (value_type (lhs));
if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
{

View File

@ -1,3 +1,7 @@
2017-10-02 Tom Tromey <tom@tromey.com>
* gdb.rust/simple.exp: Test ptype of a slice.
2017-10-02 Tom Tromey <tom@tromey.com>
* gdb.rust/simple.exp: Test index of slice.

View File

@ -85,6 +85,25 @@ gdb_test "print fromslice" " = 3"
gdb_test "print slice\[0\]" " = 3"
gdb_test "print slice as &\[i32\]\[0\]" " = 3"
gdb_test_sequence "ptype slice" "" {
" = struct &\\\[i32\\\] \\{"
" data_ptr: i32 \\*,"
" length: usize,"
"\\}"
}
gdb_test_sequence "ptype &slice\[..\]" "" {
" = struct &\\\[i32\\\] \\{"
" data_ptr: i32 \\*,"
" length: usize,"
"\\}"
}
gdb_test_sequence "ptype &b\[..\]" "" {
" = struct &\\\[\\*gdb\\*\\\] \\{"
" data_ptr: i32 \\*,"
" length: usize,"
"\\}"
}
gdb_test "print x" " = \\(23, 25\\.5\\)"
gdb_test "ptype x" " = \\(i32, f64\\)"
gdb_test "print x as (i32,f64)" " = \\(23, 25\\.5\\)"