From 8096910b54920f4c3334de555ee9dd265ed6f49d Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Sat, 10 Jul 2021 21:35:40 +0800
Subject: [PATCH] Report variant size without the discriminant
---
src/librustdoc/html/render/print_item.rs | 20 +++++++++++++-------
src/test/rustdoc/type-layout.rs | 3 ++-
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 b25323c4e0a7..4e90e611a16a 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.
"
);
w.write_str("Size: ");
- write_size_of_layout(w, ty_layout.layout);
+ write_size_of_layout(w, ty_layout.layout, 0);
writeln!(w, "
");
- 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(
"\
@@ -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, "
{name} ", name = ident);
- write_size_of_layout(w, layout);
+ write!(w, "{name}: ", name = ident);
+ write_size_of_layout(w, layout, tag_size);
writeln!(w, "");
}
w.write_str("");
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index f398dd776d9c..bc1b65c46e24 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 'A: 0 bytes'
+// @has - 'B: 1 byte'
pub enum Variants {
A,
B(u8),