From aff4cd5ce725602249c2554b04b1066d09acd31e Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Mon, 14 Jun 2021 01:49:37 +0800
Subject: [PATCH] Report Layout of enum variants
Followup of #83501, Fixes #86253.
---
src/librustdoc/html/render/print_item.rs | 36 +++++++++++++++++++++++-
src/test/rustdoc/type-layout.rs | 6 ++++
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index 8f4857a693928..f362a288bcbf9 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -7,11 +7,13 @@ use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir;
use rustc_hir::def::CtorKind;
use rustc_hir::def_id::DefId;
+use rustc_middle::bug;
use rustc_middle::middle::stability;
use rustc_middle::ty::layout::LayoutError;
-use rustc_middle::ty::TyCtxt;
+use rustc_middle::ty::{Adt, TyCtxt};
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol};
+use rustc_target::abi::Variants;
use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
@@ -1636,6 +1638,38 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
pl = if bytes == 1 { "" } else { "s" },
);
}
+ if let Variants::Multiple { variants, .. } = &ty_layout.layout.variants {
+ if !variants.is_empty() {
+ w.write_str(
+ "\
+ Size for each variant:\
+
",
+ );
+
+ let adt = if let Adt(adt, _) = ty_layout.ty.kind() {
+ adt
+ } else {
+ bug!("not an adt")
+ };
+
+ for (index, layout) in variants.iter_enumerated() {
+ let ident = adt.variants[index].ident;
+ if layout.abi.is_unsized() {
+ writeln!(w, "{name}
(unsized) ", name = ident);
+ } else {
+ let bytes = layout.size.bytes();
+ writeln!(
+ w,
+ "{name}
: {size} byte{pl} ",
+ name = ident,
+ size = bytes,
+ pl = if bytes == 1 { "" } else { "s" },
+ );
+ }
+ }
+ w.write_str("
");
+ }
+ }
}
// This kind of layout error can occur with valid code, e.g. if you try to
// get the layout of a generic type such as `Vec`.
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index 272911de6815b..f398dd776d9c6 100644
--- a/src/test/rustdoc/type-layout.rs
+++ b/src/test/rustdoc/type-layout.rs
@@ -52,3 +52,9 @@ pub struct Unsized([u8]);
// @!has type_layout/trait.MyTrait.html 'Size: '
pub trait MyTrait {}
+
+// @has type_layout/enum.Variants.html '1 byte'
+pub enum Variants {
+ A,
+ B(u8),
+}