1
Fork 0

Rollup merge of #137218 - lukas-code:layout_of_cleanup, r=compiler-errors

misc `layout_of` cleanup

See individual commits for details.

r? `@oli-obk` but feel free to reassign
This commit is contained in:
Matthias Krüger 2025-02-18 18:40:55 +01:00 committed by GitHub
commit bafff1b3af
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 175 additions and 105 deletions

View file

@ -37,9 +37,6 @@ middle_autodiff_unsafe_inner_const_ref = reading from a `Duplicated` const {$ty}
middle_bounds_check =
index out of bounds: the length is {$len} but the index is {$index}
middle_cannot_be_normalized =
unable to determine layout for `{$ty}` because `{$failure_ty}` cannot be normalized
middle_conflict_types =
this expression supplies two conflicting concrete types for the same opaque type
@ -52,9 +49,6 @@ middle_const_eval_non_int =
middle_const_not_used_in_type_alias =
const parameter `{$ct}` is part of concrete type but not used in parameter list for the `impl Trait` type alias
middle_cycle =
a cycle occurred during layout computation
middle_deprecated = use of deprecated {$kind} `{$path}`{$has_note ->
[true] : {$note}
*[other] {""}
@ -78,9 +72,23 @@ middle_erroneous_constant = erroneous constant encountered
middle_failed_writing_file =
failed to write file {$path}: {$error}"
middle_layout_cycle =
a cycle occurred during layout computation
middle_layout_normalization_failure =
unable to determine layout for `{$ty}` because `{$failure_ty}` cannot be normalized
middle_layout_references_error =
the type has an unknown layout
middle_layout_size_overflow =
values of the type `{$ty}` are too big for the target architecture
middle_layout_too_generic = the type `{$ty}` does not have a fixed layout
middle_layout_unknown =
the type `{$ty}` has an unknown layout
middle_opaque_hidden_type_mismatch =
concrete type differs from previous defining opaque type use
.label = expected `{$self_ty}`, got `{$other_ty}`
@ -98,16 +106,8 @@ middle_strict_coherence_needs_negative_coherence =
to use `strict_coherence` on this trait, the `with_negative_coherence` feature must be enabled
.label = due to this attribute
middle_too_generic = `{$ty}` does not have a fixed size
middle_type_length_limit = reached the type-length limit while instantiating `{$shrunk}`
middle_unknown_layout =
the type `{$ty}` has an unknown layout
middle_unsupported_union = we don't support unions yet: '{$ty_name}'
middle_values_too_big =
values of the type `{$ty}` are too big for the target architecture
middle_written_to_path = the full type name has been written to '{$path}'

View file

@ -132,19 +132,19 @@ impl fmt::Debug for CustomSubdiagnostic<'_> {
#[derive(Diagnostic)]
pub enum LayoutError<'tcx> {
#[diag(middle_unknown_layout)]
#[diag(middle_layout_unknown)]
Unknown { ty: Ty<'tcx> },
#[diag(middle_too_generic)]
#[diag(middle_layout_too_generic)]
TooGeneric { ty: Ty<'tcx> },
#[diag(middle_values_too_big)]
#[diag(middle_layout_size_overflow)]
Overflow { ty: Ty<'tcx> },
#[diag(middle_cannot_be_normalized)]
#[diag(middle_layout_normalization_failure)]
NormalizationFailure { ty: Ty<'tcx>, failure_ty: String },
#[diag(middle_cycle)]
#[diag(middle_layout_cycle)]
Cycle,
#[diag(middle_layout_references_error)]

View file

@ -229,11 +229,32 @@ impl fmt::Display for ValidityRequirement {
#[derive(Copy, Clone, Debug, HashStable, TyEncodable, TyDecodable)]
pub enum LayoutError<'tcx> {
/// A type doesn't have a sensible layout.
///
/// This variant is used for layout errors that don't necessarily cause
/// compile errors.
///
/// For example, this can happen if a struct contains an unsized type in a
/// non-tail field, but has an unsatisfiable bound like `str: Sized`.
Unknown(Ty<'tcx>),
/// The size of a type exceeds [`TargetDataLayout::obj_size_bound`].
SizeOverflow(Ty<'tcx>),
/// The layout can vary due to a generic parameter.
///
/// Unlike `Unknown`, this variant is a "soft" error and indicates that the layout
/// may become computable after further instantiating the generic parameter(s).
TooGeneric(Ty<'tcx>),
/// An alias failed to normalize.
///
/// This variant is necessary, because, due to trait solver incompleteness, it is
/// possible than an alias that was rigid during analysis fails to normalize after
/// revealing opaque types.
///
/// See `tests/ui/layout/normalization-failure.rs` for an example.
NormalizationFailure(Ty<'tcx>, NormalizationError<'tcx>),
/// A non-layout error is reported elsewhere.
ReferencesError(ErrorGuaranteed),
/// A type has cyclic layout, i.e. the type contains itself without indirection.
Cycle(ErrorGuaranteed),
}
@ -243,11 +264,11 @@ impl<'tcx> LayoutError<'tcx> {
use crate::fluent_generated::*;
match self {
Unknown(_) => middle_unknown_layout,
SizeOverflow(_) => middle_values_too_big,
TooGeneric(_) => middle_too_generic,
NormalizationFailure(_, _) => middle_cannot_be_normalized,
Cycle(_) => middle_cycle,
Unknown(_) => middle_layout_unknown,
SizeOverflow(_) => middle_layout_size_overflow,
TooGeneric(_) => middle_layout_too_generic,
NormalizationFailure(_, _) => middle_layout_normalization_failure,
Cycle(_) => middle_layout_cycle,
ReferencesError(_) => middle_layout_references_error,
}
}
@ -276,7 +297,7 @@ impl<'tcx> fmt::Display for LayoutError<'tcx> {
match *self {
LayoutError::Unknown(ty) => write!(f, "the type `{ty}` has an unknown layout"),
LayoutError::TooGeneric(ty) => {
write!(f, "`{ty}` does not have a fixed size")
write!(f, "the type `{ty}` does not have a fixed layout")
}
LayoutError::SizeOverflow(ty) => {
write!(f, "values of the type `{ty}` are too big for the target architecture")