Rollup merge of #133704 - RalfJung:promoted-size-overflow-ice, r=compiler-errors
fix ICE when promoted has layout size overflow Turns out there is no reason to distinguish `tainted_by_errors` and `can_be_spurious` here, we can just track whether we allow this even in "infallible" constants. Fixes https://github.com/rust-lang/rust/issues/125476
This commit is contained in:
commit
b1a643e599
25 changed files with 218 additions and 79 deletions
|
@ -46,7 +46,7 @@ impl ErrorHandled {
|
|||
pub fn emit_note(&self, tcx: TyCtxt<'_>) {
|
||||
match self {
|
||||
&ErrorHandled::Reported(err, span) => {
|
||||
if !err.is_tainted_by_errors && !span.is_dummy() {
|
||||
if !err.allowed_in_infallible && !span.is_dummy() {
|
||||
tcx.dcx().emit_note(error::ErroneousConstant { span });
|
||||
}
|
||||
}
|
||||
|
@ -58,34 +58,26 @@ impl ErrorHandled {
|
|||
#[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, TyEncodable, TyDecodable)]
|
||||
pub struct ReportedErrorInfo {
|
||||
error: ErrorGuaranteed,
|
||||
is_tainted_by_errors: bool,
|
||||
/// Whether this is the kind of error that can sometimes occur, and sometimes not.
|
||||
/// Used for resource exhaustion errors.
|
||||
can_be_spurious: bool,
|
||||
/// Whether this error is allowed to show up even in otherwise "infallible" promoteds.
|
||||
/// This is for things like overflows during size computation or resource exhaustion.
|
||||
allowed_in_infallible: bool,
|
||||
}
|
||||
|
||||
impl ReportedErrorInfo {
|
||||
#[inline]
|
||||
pub fn tainted_by_errors(error: ErrorGuaranteed) -> ReportedErrorInfo {
|
||||
ReportedErrorInfo { is_tainted_by_errors: true, can_be_spurious: false, error }
|
||||
}
|
||||
#[inline]
|
||||
pub fn spurious(error: ErrorGuaranteed) -> ReportedErrorInfo {
|
||||
ReportedErrorInfo { can_be_spurious: true, is_tainted_by_errors: false, error }
|
||||
pub fn allowed_in_infallible(error: ErrorGuaranteed) -> ReportedErrorInfo {
|
||||
ReportedErrorInfo { allowed_in_infallible: true, error }
|
||||
}
|
||||
|
||||
pub fn is_tainted_by_errors(&self) -> bool {
|
||||
self.is_tainted_by_errors
|
||||
}
|
||||
pub fn can_be_spurious(&self) -> bool {
|
||||
self.can_be_spurious
|
||||
pub fn is_allowed_in_infallible(&self) -> bool {
|
||||
self.allowed_in_infallible
|
||||
}
|
||||
}
|
||||
|
||||
impl From<ErrorGuaranteed> for ReportedErrorInfo {
|
||||
#[inline]
|
||||
fn from(error: ErrorGuaranteed) -> ReportedErrorInfo {
|
||||
ReportedErrorInfo { is_tainted_by_errors: false, can_be_spurious: false, error }
|
||||
ReportedErrorInfo { allowed_in_infallible: false, error }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue