Special case "&str" in Rust parser
authorTom Tromey <tom@tromey.com>
Wed, 17 May 2023 15:07:50 +0000 (09:07 -0600)
committerTom Tromey <tom@tromey.com>
Wed, 17 May 2023 17:47:16 +0000 (11:47 -0600)
"&str" is an important type in Rust -- it's the type of string
literals.  However, the compiler puts it in the DWARF in a funny way.
The slice itself is present and named "&str".  However, the Rust
parser doesn't look for types with names like this, but instead tries
to construct them from components.  In this case it tries to make a
pointer-to-"str" -- but "str" isn't always available, and in any case
that wouldn't yield the best result.

This patch adds a special case for &str.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=22251
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
gdb/rust-parse.c
gdb/testsuite/gdb.rust/simple.exp

index 648e48dda401c31060ac37b78101782666d1be95..427169611d370d609a5c568fc23df06e508cc7ba 100644 (file)
@@ -1682,6 +1682,16 @@ rust_parser::parse_slice_type ()
 {
   assume ('&');
 
+  /* Handle &str specially.  This is an important type in Rust.  While
+     the compiler does emit the "&str" type in the DWARF, just "str"
+     itself isn't always available -- but it's handy if this works
+     seamlessly.  */
+  if (current_token == IDENT && get_string () == "str")
+    {
+      lex ();
+      return rust_slice_type ("&str", get_type ("u8"), get_type ("usize"));
+    }
+
   bool is_slice = current_token == '[';
   if (is_slice)
     lex ();
index 08ebed3f103b5712c909ef61632b9242bef2e665..a615b92ec4709fd49542d6a79c315e8d8ffb083e 100644 (file)
@@ -68,6 +68,9 @@ gdb_test "print simple::Unit{23}" "'}', '\.\.', or identifier expected"
 gdb_test "print f" " = \"hi bob\""
 gdb_test "print fslice" " = \"bob\""
 gdb_test "print &f\[3..\]" " = \"bob\""
+gdb_test "whatis f" "type = &str"
+gdb_test "print *(&f as *mut &str)" " = \"hi bob\"" \
+    "print via cast to &str"
 
 gdb_test "print g" " = \\(\\*mut \\\[u8; 6\\\]\\) $hex b\"hi bob\""
 gdb_test "ptype g" " = \\*mut \\\[u8; 6\\\]"