Handle TYPE_CODE_PTR when printing Rust types

This changes the Rust type printers to handle TYPE_CODE_PTR.  The
current approach is not ideal, because currently the code can't
distinguish between mut and const, or between pointers and references.
(These are debuginfo deficiencies, for which there are rustc bugs on
file.)

Meanwhile, this at least clears up the case seen in PR rust/23625.

Tested on x86-64 Fedora 28.  The nightly compiler gives the best
results, but I regression-tested with stable and beta as well.

gdb/ChangeLog
2018-11-16  Tom Tromey  <tom@tromey.com>

	PR rust/23625:
	* rust-lang.c (rust_internal_print_type): Handle TYPE_CODE_PTR.

gdb/testsuite/ChangeLog
2018-11-19  Tom Tromey  <tom@tromey.com>

	PR rust/23625:
	* gdb.rust/simple.exp: Add ptype test.  Update expected output.
	* gdb.rust/expr.exp: Update expected output.  Change one test.
This commit is contained in:
Tom Tromey 2018-11-16 15:30:35 -07:00
parent 994b876a51
commit 73fc52c4cc
5 changed files with 34 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2018-11-16 Tom Tromey <tom@tromey.com>
PR rust/23625:
* rust-lang.c (rust_internal_print_type): Handle TYPE_CODE_PTR.
2018-11-19 Simon Marchi <simon.marchi@ericsson.com>
* infrun.c (displaced_step_inferior_states): Change type to

View File

@ -918,6 +918,20 @@ rust_internal_print_type (struct type *type, const char *varstring,
}
break;
case TYPE_CODE_PTR:
{
if (TYPE_NAME (type) != nullptr)
fputs_filtered (TYPE_NAME (type), stream);
else
{
/* We currently can't distinguish between pointers and
references. */
fputs_filtered ("*mut ", stream);
type_print (TYPE_TARGET_TYPE (type), "", stream, 0);
}
}
break;
default:
c_printer:
c_print_type (type, varstring, stream, show, level, flags);

View File

@ -1,3 +1,9 @@
2018-11-19 Tom Tromey <tom@tromey.com>
PR rust/23625:
* gdb.rust/simple.exp: Add ptype test. Update expected output.
* gdb.rust/expr.exp: Update expected output. Change one test.
2018-11-19 Tom Tromey <tom@tromey.com>
* gdb.rust/simple.rs: Don't initialize empty_enum_value.

View File

@ -134,8 +134,8 @@ gdb_test "ptype \[23usize; 4\]" " = \\\[usize; 4\\\]"
gdb_test "print \[mut 23usize; 4\]" " = \\\[23, 23, 23, 23\\\]"
# Test lexer corner cases.
gdb_test "print 0x0 as *const ()" " = \\\(\\\(\\\) \\*\\\) 0x0"
gdb_test "print 0x0 as fn(i64) -> ()" " = \\\(\\\(\\\) \\\(\\*\\\)\\\(i64\\\)\\\) 0x0"
gdb_test "print 0x0 as *mut ()" " = \\\(\\*mut \\\(\\\)\\\) 0x0"
gdb_test "print 0x0 as fn(i64) -> ()" " = \\\(\\*mut fn \\\(i64\\\) -> \\\(\\\)\\\) 0x0"
gdb_test "print r#" "syntax error in expression, near `#'\\."
gdb_test "printf \"%d %d\\n\", 23+1, 23-1" "24 22"

View File

@ -54,6 +54,7 @@ gdb_test "print *&c" " = 0"
gdb_test "print *(&c as &i32)" " = 0"
gdb_test "print *(&c as *const i32)" " = 0"
gdb_test "print *(&c as *mut i32)" " = 0"
gdb_test "ptype &c as *mut i32" "\\*mut i32"
gdb_test "print/c f\[0\]" " = 104 'h'"
@ -68,8 +69,8 @@ gdb_test "print f" " = \"hi bob\""
gdb_test "print fslice" " = \"bob\""
gdb_test "print &f\[3..\]" " = \"bob\""
gdb_test "print g" " = \\(u8 \\(\\*\\)\\\[6\\\]\\) $hex b\"hi bob\""
gdb_test "ptype g" " = u8 \\(\\*\\)\\\[6\\\]"
gdb_test "print g" " = \\(\\*mut \\\[u8; 6\\\]\\) $hex b\"hi bob\""
gdb_test "ptype g" " = \\*mut \\\[u8; 6\\\]"
gdb_test "print v" " = simple::Something::Three"
gdb_test_sequence "ptype v" "" {
@ -91,19 +92,19 @@ gdb_test "print slice as &\[i32\]\[0\]" " = 3"
gdb_test_sequence "ptype slice" "" {
" = struct &\\\[i32\\\] \\{"
" data_ptr: i32 \\*,"
" data_ptr: \\*mut i32,"
" length: usize,"
"\\}"
}
gdb_test_sequence "ptype &slice\[..\]" "" {
" = struct &\\\[i32\\\] \\{"
" data_ptr: i32 \\*,"
" data_ptr: \\*mut i32,"
" length: usize,"
"\\}"
}
gdb_test_sequence "ptype &b\[..\]" "" {
" = struct &\\\[\\*gdb\\*\\\] \\{"
" data_ptr: i32 \\*,"
" data_ptr: \\*mut i32,"
" length: usize,"
"\\}"
}
@ -281,7 +282,7 @@ gdb_test "print 23..97.0" "Range expression with different types"
gdb_test "print (*parametrized.next.val)" \
" = simple::ParametrizedStruct<i32> {next: simple::ParametrizedEnum<\[a-z:\]*Box<simple::ParametrizedStruct<i32>>>::Empty, value: 1}"
gdb_test "print parametrized.next.val" \
" = \\(simple::ParametrizedStruct<i32> \\*\\) $hex"
" = \\(\\*mut simple::ParametrizedStruct<i32>\\) $hex"
gdb_test "print parametrized" \
" = simple::ParametrizedStruct<i32> \\{next: simple::ParametrizedEnum<\[a-z:\]*Box<simple::ParametrizedStruct<i32>>>::Val\\{val: $hex\\}, value: 0\\}"