about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDeadbeef <ent3rm4n@gmail.com>2021-07-10 21:35:40 +0800
committerDeadbeef <ent3rm4n@gmail.com>2021-08-31 05:25:36 +0000
commit8096910b54920f4c3334de555ee9dd265ed6f49d (patch)
tree862bd381568f3f65c423772bdf32bd1e5fba855c
parentc349b79029770e39963fadf5021cfa6a6cfe5472 (diff)
downloadrust-8096910b54920f4c3334de555ee9dd265ed6f49d.tar.gz
rust-8096910b54920f4c3334de555ee9dd265ed6f49d.zip
Report variant size without the discriminant
-rw-r--r--src/librustdoc/html/render/print_item.rs20
-rw-r--r--src/test/rustdoc/type-layout.rs3
2 files changed, 15 insertions, 8 deletions
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index b25323c4e0a..4e90e611a16 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -13,7 +13,7 @@ use rustc_middle::ty::layout::LayoutError;
 use rustc_middle::ty::{Adt, TyCtxt};
 use rustc_span::hygiene::MacroKind;
 use rustc_span::symbol::{kw, sym, Symbol};
-use rustc_target::abi::{Layout, Variants};
+use rustc_target::abi::{Layout, Primitive, Variants};
 
 use super::{
     collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
@@ -1606,11 +1606,11 @@ fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) {
 }
 
 fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
-    fn write_size_of_layout(w: &mut Buffer, layout: &Layout) {
+    fn write_size_of_layout(w: &mut Buffer, layout: &Layout, tag_size: u64) {
         if layout.abi.is_unsized() {
             write!(w, "(unsized)");
         } else {
-            let bytes = layout.size.bytes();
+            let bytes = layout.size.bytes() - tag_size;
             write!(w, "{size} byte{pl}", size = bytes, pl = if bytes == 1 { "" } else { "s" },);
         }
     }
@@ -1637,9 +1637,9 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
                  chapter for details on type layout guarantees.</p></div>"
             );
             w.write_str("<p><strong>Size:</strong> ");
-            write_size_of_layout(w, ty_layout.layout);
+            write_size_of_layout(w, ty_layout.layout, 0);
             writeln!(w, "</p>");
-            if let Variants::Multiple { variants, .. } = &ty_layout.layout.variants {
+            if let Variants::Multiple { variants, tag, .. } = &ty_layout.layout.variants {
                 if !variants.is_empty() {
                     w.write_str(
                         "<p>\
@@ -1653,10 +1653,16 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
                         span_bug!(tcx.def_span(ty_def_id), "not an adt")
                     };
 
+                    let tag_size = if let Primitive::Int(i, _) = tag.value {
+                        i.size().bytes()
+                    } else {
+                        span_bug!(tcx.def_span(ty_def_id), "tag is not int")
+                    };
+
                     for (index, layout) in variants.iter_enumerated() {
                         let ident = adt.variants[index].ident;
-                        write!(w, "<li><code>{name}</code> ", name = ident);
-                        write_size_of_layout(w, layout);
+                        write!(w, "<li><code>{name}</code>: ", name = ident);
+                        write_size_of_layout(w, layout, tag_size);
                         writeln!(w, "</li>");
                     }
                     w.write_str("</ul></p>");
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index f398dd776d9..bc1b65c46e2 100644
--- a/src/test/rustdoc/type-layout.rs
+++ b/src/test/rustdoc/type-layout.rs
@@ -53,7 +53,8 @@ pub struct Unsized([u8]);
 // @!has type_layout/trait.MyTrait.html 'Size: '
 pub trait MyTrait {}
 
-// @has type_layout/enum.Variants.html '1 byte'
+// @has type_layout/enum.Variants.html '<code>A</code>: 0 bytes'
+// @has - '<code>B</code>: 1 byte'
 pub enum Variants {
     A,
     B(u8),