about summary refs log tree commit diff
diff options
context:
space:
mode:
authorhkalbasi <hamidrezakalbasi@protonmail.com>2023-06-10 11:32:37 +0330
committerhkalbasi <hamidrezakalbasi@protonmail.com>2023-06-10 11:32:37 +0330
commit1dd76e8a9d78b58c4920f5041314d7b5e089965c (patch)
tree152305dc7d7ac59b95c73ad374169d3f10831ac0
parent6fbf6ef514876e68d98211051ef54d0dcd2b8550 (diff)
downloadrust-1dd76e8a9d78b58c4920f5041314d7b5e089965c.tar.gz
rust-1dd76e8a9d78b58c4920f5041314d7b5e089965c.zip
Fix panic in displaying unsized structs
-rw-r--r--crates/hir-ty/src/display.rs15
-rw-r--r--crates/ide/src/hover/tests.rs20
2 files changed, 34 insertions, 1 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index 9d5cf47da8d..bb02a153145 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -2,7 +2,10 @@
 //! HIR back into source code, and just displaying them for debugging/testing
 //! purposes.
 
-use std::fmt::{self, Debug};
+use std::{
+    fmt::{self, Debug},
+    mem::size_of,
+};
 
 use base_db::CrateId;
 use chalk_ir::{BoundVar, TyKind};
@@ -552,6 +555,16 @@ fn render_const_scalar(
                 f.write_str("&")?;
                 render_const_scalar(f, bytes, memory_map, t)
             }
+            TyKind::Adt(adt, _) if b.len() == 2 * size_of::<usize>() => match adt.0 {
+                hir_def::AdtId::StructId(s) => {
+                    let data = f.db.struct_data(s);
+                    write!(f, "&{}", data.name.display(f.db.upcast()))?;
+                    Ok(())
+                }
+                _ => {
+                    return f.write_str("<unsized-enum-or-union>");
+                }
+            },
             _ => {
                 let addr = usize::from_le_bytes(b.try_into().unwrap());
                 let Ok(layout) = f.db.layout_of_ty(t.clone(), krate) else {
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 22bbdf37a8e..f75ebfa12eb 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -4525,6 +4525,26 @@ const FOO$0: Tree = {
             ```
         "#]],
     );
+    // FIXME: Show the data of unsized structs
+    check(
+        r#"
+//- minicore: slice, index, coerce_unsized, transmute
+#[repr(transparent)]
+struct S<T: ?Sized>(T);
+const FOO$0: &S<[u8]> = core::mem::transmute::<&[u8], _>(&[1, 2, 3]);
+"#,
+        expect![[r#"
+            *FOO*
+
+            ```rust
+            test
+            ```
+
+            ```rust
+            const FOO: &S<[u8]> = &S
+            ```
+        "#]],
+    );
 }
 
 #[test]