Skip to content

Commit

Permalink
Rollup merge of #110095 - matthewjasper:ty-utils-diagnostics, r=compi…
Browse files Browse the repository at this point in the history
…ler-errors

Migrate remainder of rustc_ty_utils to `SessionDiagnostic`

This moves the remaining errors in `rust_ty_utils` to `SessionsDiagnostic`.

r? ``@davidtwco``
  • Loading branch information
matthiaskrgr authored Apr 9, 2023
2 parents 164d70d + c17a705 commit f482745
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 24 deletions.
10 changes: 10 additions & 0 deletions compiler/rustc_ty_utils/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,13 @@ ty_utils_control_flow_not_supported = control flow is not supported in generic c
ty_utils_inline_asm_not_supported = assembly is not supported in generic constants
ty_utils_operation_not_supported = unsupported operation in generic constants
ty_utils_unexpected_fnptr_associated_item = `FnPtr` trait with unexpected associated item
ty_utils_zero_length_simd_type = monomorphising SIMD type `{$ty}` of zero length
ty_utils_multiple_array_fields_simd_type = monomorphising SIMD type `{$ty}` with more than one array field
ty_utils_oversized_simd_type = monomorphising SIMD type `{$ty}` of length greater than {$max_lanes}
ty_utils_non_primative_simd_type = monomorphising SIMD type `{$ty}` with a non-primitive-scalar (integer/float/pointer) element type `{$e_ty}`
33 changes: 33 additions & 0 deletions compiler/rustc_ty_utils/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,36 @@ pub enum GenericConstantTooComplexSub {
#[label(ty_utils_operation_not_supported)]
OperationNotSupported(#[primary_span] Span),
}

#[derive(Diagnostic)]
#[diag(ty_utils_unexpected_fnptr_associated_item)]
pub struct UnexpectedFnPtrAssociatedItem {
#[primary_span]
pub span: Span,
}

#[derive(Diagnostic)]
#[diag(ty_utils_zero_length_simd_type)]
pub struct ZeroLengthSimdType<'tcx> {
pub ty: Ty<'tcx>,
}

#[derive(Diagnostic)]
#[diag(ty_utils_multiple_array_fields_simd_type)]
pub struct MultipleArrayFieldsSimdType<'tcx> {
pub ty: Ty<'tcx>,
}

#[derive(Diagnostic)]
#[diag(ty_utils_oversized_simd_type)]
pub struct OversizedSimdType<'tcx> {
pub ty: Ty<'tcx>,
pub max_lanes: u64,
}

#[derive(Diagnostic)]
#[diag(ty_utils_non_primative_simd_type)]
pub struct NonPrimitiveSimdType<'tcx> {
pub ty: Ty<'tcx>,
pub e_ty: Ty<'tcx>,
}
9 changes: 5 additions & 4 deletions compiler/rustc_ty_utils/src/instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ use rustc_span::sym;
use rustc_trait_selection::traits;
use traits::{translate_substs, Reveal};

use crate::errors::UnexpectedFnPtrAssociatedItem;

fn resolve_instance<'tcx>(
tcx: TyCtxt<'tcx>,
key: ty::ParamEnvAnd<'tcx, (DefId, SubstsRef<'tcx>)>,
Expand Down Expand Up @@ -282,10 +284,9 @@ fn resolve_associated_item<'tcx>(
substs: rcvr_substs,
})
} else {
tcx.sess.span_fatal(
tcx.def_span(trait_item_id),
"`FnPtrAddr` trait with unexpected assoc item",
)
tcx.sess.emit_fatal(UnexpectedFnPtrAssociatedItem {
span: tcx.def_span(trait_item_id),
})
}
} else {
None
Expand Down
39 changes: 19 additions & 20 deletions compiler/rustc_ty_utils/src/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ use rustc_target::abi::*;
use std::fmt::Debug;
use std::iter;

use crate::errors::{
MultipleArrayFieldsSimdType, NonPrimitiveSimdType, OversizedSimdType, ZeroLengthSimdType,
};
use crate::layout_sanity_check::sanity_check_layout;

pub fn provide(providers: &mut ty::query::Providers) {
Expand Down Expand Up @@ -294,6 +297,8 @@ fn layout_of_uncached<'tcx>(
return Err(LayoutError::Unknown(ty));
}

let fields = &def.non_enum_variant().fields;

// Supported SIMD vectors are homogeneous ADTs with at least one field:
//
// * #[repr(simd)] struct S(T, T, T, T);
Expand All @@ -304,18 +309,22 @@ fn layout_of_uncached<'tcx>(

// SIMD vectors with zero fields are not supported.
// (should be caught by typeck)
if def.non_enum_variant().fields.is_empty() {
tcx.sess.fatal(&format!("monomorphising SIMD type `{}` of zero length", ty));
if fields.is_empty() {
tcx.sess.emit_fatal(ZeroLengthSimdType { ty })
}

// Type of the first ADT field:
let f0_ty = def.non_enum_variant().fields[FieldIdx::from_u32(0)].ty(tcx, substs);
let f0_ty = fields[FieldIdx::from_u32(0)].ty(tcx, substs);

// Heterogeneous SIMD vectors are not supported:
// (should be caught by typeck)
for fi in &def.non_enum_variant().fields {
for fi in fields {
if fi.ty(tcx, substs) != f0_ty {
tcx.sess.fatal(&format!("monomorphising heterogeneous SIMD type `{}`", ty));
tcx.sess.delay_span_bug(
DUMMY_SP,
"#[repr(simd)] was applied to an ADT with hetrogeneous field type",
);
return Err(LayoutError::Unknown(ty));
}
}

Expand All @@ -330,12 +339,9 @@ fn layout_of_uncached<'tcx>(
// First ADT field is an array:

// SIMD vectors with multiple array fields are not supported:
// (should be caught by typeck)
// Can't be caught by typeck with a generic simd type.
if def.non_enum_variant().fields.len() != 1 {
tcx.sess.fatal(&format!(
"monomorphising SIMD type `{}` with more than one array field",
ty
));
tcx.sess.emit_fatal(MultipleArrayFieldsSimdType { ty });
}

// Extract the number of elements from the layout of the array field:
Expand All @@ -355,24 +361,17 @@ fn layout_of_uncached<'tcx>(
//
// Can't be caught in typeck if the array length is generic.
if e_len == 0 {
tcx.sess.fatal(&format!("monomorphising SIMD type `{}` of zero length", ty));
tcx.sess.emit_fatal(ZeroLengthSimdType { ty });
} else if e_len > MAX_SIMD_LANES {
tcx.sess.fatal(&format!(
"monomorphising SIMD type `{}` of length greater than {}",
ty, MAX_SIMD_LANES,
));
tcx.sess.emit_fatal(OversizedSimdType { ty, max_lanes: MAX_SIMD_LANES });
}

// Compute the ABI of the element type:
let e_ly = cx.layout_of(e_ty)?;
let Abi::Scalar(e_abi) = e_ly.abi else {
// This error isn't caught in typeck, e.g., if
// the element type of the vector is generic.
tcx.sess.fatal(&format!(
"monomorphising SIMD type `{}` with a non-primitive-scalar \
(integer/float/pointer) element type `{}`",
ty, e_ty
))
tcx.sess.emit_fatal(NonPrimitiveSimdType { ty, e_ty });
};

// Compute the size and alignment of the vector:
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_ty_utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#![feature(never_type)]
#![feature(box_patterns)]
#![recursion_limit = "256"]
#![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)]

#[macro_use]
extern crate rustc_middle;
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/simd/monomorphize-heterogeneous.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#![feature(repr_simd)]

#[repr(simd)]
struct I64F64(i64, f64);
//~^ ERROR SIMD vector should be homogeneous

static X: I64F64 = I64F64(1, 2.0);

fn main() {}
9 changes: 9 additions & 0 deletions tests/ui/simd/monomorphize-heterogeneous.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0076]: SIMD vector should be homogeneous
--> $DIR/monomorphize-heterogeneous.rs:4:1
|
LL | struct I64F64(i64, f64);
| ^^^^^^^^^^^^^ SIMD elements must have the same type

error: aborting due to previous error

For more information about this error, try `rustc --explain E0076`.

0 comments on commit f482745

Please sign in to comment.