extend some comments and clarify some names around enum tag type computation
This commit is contained in:
parent
90b6588979
commit
add37c0c25
4 changed files with 14 additions and 6 deletions
|
|
@ -812,7 +812,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
|
|||
let (max, min) = largest_niche
|
||||
// We might have no inhabited variants, so pretend there's at least one.
|
||||
.unwrap_or((0, 0));
|
||||
let (min_ity, signed) = discr_range_of_repr(min, max); //Integer::repr_discr(tcx, ty, &repr, min, max);
|
||||
let (min_ity, signed) = discr_range_of_repr(min, max); //Integer::discr_range_of_repr(tcx, ty, &repr, min, max);
|
||||
|
||||
let mut align = dl.aggregate_align;
|
||||
let mut max_repr_align = repr.align;
|
||||
|
|
|
|||
|
|
@ -183,6 +183,11 @@ impl ReprOptions {
|
|||
|
||||
/// Returns the discriminant type, given these `repr` options.
|
||||
/// This must only be called on enums!
|
||||
///
|
||||
/// This is the "typeck type" of the discriminant, which is effectively the maximum size:
|
||||
/// discriminant values will be wrapped to fit (with a lint). Layout can later decide to use a
|
||||
/// smaller type for the tag that stores the discriminant at runtime and that will work just
|
||||
/// fine, it just induces casts when getting/setting the discriminant.
|
||||
pub fn discr_type(&self) -> IntegerType {
|
||||
self.int.unwrap_or(IntegerType::Pointer(true))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,10 @@ impl abi::Integer {
|
|||
/// signed discriminant range and `#[repr]` attribute.
|
||||
/// N.B.: `u128` values above `i128::MAX` will be treated as signed, but
|
||||
/// that shouldn't affect anything, other than maybe debuginfo.
|
||||
fn repr_discr<'tcx>(
|
||||
///
|
||||
/// This is the basis for computing the type of the *tag* of an enum (which can be smaller than
|
||||
/// the type of the *discriminant*, which is determined by [`ReprOptions::discr_type`]).
|
||||
fn discr_range_of_repr<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
repr: &ReprOptions,
|
||||
|
|
|
|||
|
|
@ -639,8 +639,8 @@ fn layout_of_uncached<'tcx>(
|
|||
// UnsafeCell and UnsafePinned both disable niche optimizations
|
||||
let is_special_no_niche = def.is_unsafe_cell() || def.is_unsafe_pinned();
|
||||
|
||||
let get_discriminant_type =
|
||||
|min, max| abi::Integer::repr_discr(tcx, ty, &def.repr(), min, max);
|
||||
let discr_range_of_repr =
|
||||
|min, max| abi::Integer::discr_range_of_repr(tcx, ty, &def.repr(), min, max);
|
||||
|
||||
let discriminants_iter = || {
|
||||
def.is_enum()
|
||||
|
|
@ -663,7 +663,7 @@ fn layout_of_uncached<'tcx>(
|
|||
def.is_enum(),
|
||||
is_special_no_niche,
|
||||
tcx.layout_scalar_valid_range(def.did()),
|
||||
get_discriminant_type,
|
||||
discr_range_of_repr,
|
||||
discriminants_iter(),
|
||||
!maybe_unsized,
|
||||
)
|
||||
|
|
@ -688,7 +688,7 @@ fn layout_of_uncached<'tcx>(
|
|||
def.is_enum(),
|
||||
is_special_no_niche,
|
||||
tcx.layout_scalar_valid_range(def.did()),
|
||||
get_discriminant_type,
|
||||
discr_range_of_repr,
|
||||
discriminants_iter(),
|
||||
!maybe_unsized,
|
||||
) else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue