Move SIMD layout errors to SessionDiagnostic
This commit is contained in:
parent
f7f2eb3e41
commit
804e93871d
4 changed files with 55 additions and 20 deletions
|
@ -47,3 +47,11 @@ ty_utils_inline_asm_not_supported = assembly is not supported in generic constan
|
||||||
ty_utils_operation_not_supported = unsupported operation 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_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}`
|
||||||
|
|
|
@ -74,3 +74,29 @@ pub struct UnexpectedFnPtrAssociatedItem {
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
pub span: 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>,
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,9 @@ use rustc_target::abi::*;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
|
use crate::errors::{
|
||||||
|
MultipleArrayFieldsSimdType, NonPrimitiveSimdType, OversizedSimdType, ZeroLengthSimdType,
|
||||||
|
};
|
||||||
use crate::layout_sanity_check::sanity_check_layout;
|
use crate::layout_sanity_check::sanity_check_layout;
|
||||||
|
|
||||||
pub fn provide(providers: &mut ty::query::Providers) {
|
pub fn provide(providers: &mut ty::query::Providers) {
|
||||||
|
@ -294,6 +297,8 @@ fn layout_of_uncached<'tcx>(
|
||||||
return Err(LayoutError::Unknown(ty));
|
return Err(LayoutError::Unknown(ty));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let fields = &def.non_enum_variant().fields;
|
||||||
|
|
||||||
// Supported SIMD vectors are homogeneous ADTs with at least one field:
|
// Supported SIMD vectors are homogeneous ADTs with at least one field:
|
||||||
//
|
//
|
||||||
// * #[repr(simd)] struct S(T, T, T, T);
|
// * #[repr(simd)] struct S(T, T, T, T);
|
||||||
|
@ -304,18 +309,22 @@ fn layout_of_uncached<'tcx>(
|
||||||
|
|
||||||
// SIMD vectors with zero fields are not supported.
|
// SIMD vectors with zero fields are not supported.
|
||||||
// (should be caught by typeck)
|
// (should be caught by typeck)
|
||||||
if def.non_enum_variant().fields.is_empty() {
|
if fields.is_empty() {
|
||||||
tcx.sess.fatal(&format!("monomorphising SIMD type `{}` of zero length", ty));
|
tcx.sess.emit_fatal(ZeroLengthSimdType { ty })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type of the first ADT field:
|
// 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:
|
// Heterogeneous SIMD vectors are not supported:
|
||||||
// (should be caught by typeck)
|
// (should be caught by typeck)
|
||||||
for fi in &def.non_enum_variant().fields {
|
for fi in fields {
|
||||||
if fi.ty(tcx, substs) != f0_ty {
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,12 +339,9 @@ fn layout_of_uncached<'tcx>(
|
||||||
// First ADT field is an array:
|
// First ADT field is an array:
|
||||||
|
|
||||||
// SIMD vectors with multiple array fields are not supported:
|
// 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 {
|
if def.non_enum_variant().fields.len() != 1 {
|
||||||
tcx.sess.fatal(&format!(
|
tcx.sess.emit_fatal(MultipleArrayFieldsSimdType { ty });
|
||||||
"monomorphising SIMD type `{}` with more than one array field",
|
|
||||||
ty
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract the number of elements from the layout of the array field:
|
// Extract the number of elements from the layout of the array field:
|
||||||
|
@ -355,12 +361,9 @@ fn layout_of_uncached<'tcx>(
|
||||||
//
|
//
|
||||||
// Can't be caught in typeck if the array length is generic.
|
// Can't be caught in typeck if the array length is generic.
|
||||||
if e_len == 0 {
|
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 {
|
} else if e_len > MAX_SIMD_LANES {
|
||||||
tcx.sess.fatal(&format!(
|
tcx.sess.emit_fatal(OversizedSimdType { ty, max_lanes: MAX_SIMD_LANES });
|
||||||
"monomorphising SIMD type `{}` of length greater than {}",
|
|
||||||
ty, MAX_SIMD_LANES,
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the ABI of the element type:
|
// Compute the ABI of the element type:
|
||||||
|
@ -368,11 +371,7 @@ fn layout_of_uncached<'tcx>(
|
||||||
let Abi::Scalar(e_abi) = e_ly.abi else {
|
let Abi::Scalar(e_abi) = e_ly.abi else {
|
||||||
// This error isn't caught in typeck, e.g., if
|
// This error isn't caught in typeck, e.g., if
|
||||||
// the element type of the vector is generic.
|
// the element type of the vector is generic.
|
||||||
tcx.sess.fatal(&format!(
|
tcx.sess.emit_fatal(NonPrimitiveSimdType {ty, e_ty });
|
||||||
"monomorphising SIMD type `{}` with a non-primitive-scalar \
|
|
||||||
(integer/float/pointer) element type `{}`",
|
|
||||||
ty, e_ty
|
|
||||||
))
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Compute the size and alignment of the vector:
|
// Compute the size and alignment of the vector:
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
#![feature(box_patterns)]
|
#![feature(box_patterns)]
|
||||||
#![recursion_limit = "256"]
|
#![recursion_limit = "256"]
|
||||||
|
#![deny(rustc::untranslatable_diagnostic)]
|
||||||
|
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate rustc_middle;
|
extern crate rustc_middle;
|
||||||
|
|
Loading…
Add table
Reference in a new issue