mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 17:03:35 +00:00
Rollup merge of #124516 - oli-obk:taint_const_eval, r=RalfJung
Allow monomorphization time const eval failures if the cause is a type layout issue r? `@RalfJung` fixes #124348
This commit is contained in:
commit
eb6b35b5bc
@ -2,7 +2,7 @@ use std::mem;
|
|||||||
|
|
||||||
use rustc_errors::{DiagArgName, DiagArgValue, DiagMessage, Diagnostic, IntoDiagArg};
|
use rustc_errors::{DiagArgName, DiagArgValue, DiagMessage, Diagnostic, IntoDiagArg};
|
||||||
use rustc_hir::CRATE_HIR_ID;
|
use rustc_hir::CRATE_HIR_ID;
|
||||||
use rustc_middle::mir::interpret::Provenance;
|
use rustc_middle::mir::interpret::{Provenance, ReportedErrorInfo};
|
||||||
use rustc_middle::mir::AssertKind;
|
use rustc_middle::mir::AssertKind;
|
||||||
use rustc_middle::query::TyCtxtAt;
|
use rustc_middle::query::TyCtxtAt;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
@ -139,9 +139,10 @@ where
|
|||||||
ErrorHandled::TooGeneric(span)
|
ErrorHandled::TooGeneric(span)
|
||||||
}
|
}
|
||||||
err_inval!(AlreadyReported(guar)) => ErrorHandled::Reported(guar, span),
|
err_inval!(AlreadyReported(guar)) => ErrorHandled::Reported(guar, span),
|
||||||
err_inval!(Layout(LayoutError::ReferencesError(guar))) => {
|
err_inval!(Layout(LayoutError::ReferencesError(guar))) => ErrorHandled::Reported(
|
||||||
ErrorHandled::Reported(guar.into(), span)
|
ReportedErrorInfo::tainted_by_errors(guar),
|
||||||
}
|
span,
|
||||||
|
),
|
||||||
// Report remaining errors.
|
// Report remaining errors.
|
||||||
_ => {
|
_ => {
|
||||||
let (our_span, frames) = get_span_and_frames();
|
let (our_span, frames) = get_span_and_frames();
|
||||||
|
@ -1181,9 +1181,20 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>> {
|
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>> {
|
||||||
M::eval_mir_constant(self, *val, span, layout, |ecx, val, span, layout| {
|
M::eval_mir_constant(self, *val, span, layout, |ecx, val, span, layout| {
|
||||||
let const_val = val.eval(*ecx.tcx, ecx.param_env, span).map_err(|err| {
|
let const_val = val.eval(*ecx.tcx, ecx.param_env, span).map_err(|err| {
|
||||||
if M::ALL_CONSTS_ARE_PRECHECKED && !matches!(err, ErrorHandled::TooGeneric(..)) {
|
if M::ALL_CONSTS_ARE_PRECHECKED {
|
||||||
// Looks like the const is not captued by `required_consts`, that's bad.
|
match err {
|
||||||
bug!("interpret const eval failure of {val:?} which is not in required_consts");
|
ErrorHandled::TooGeneric(..) => {},
|
||||||
|
ErrorHandled::Reported(reported, span) => {
|
||||||
|
if reported.is_tainted_by_errors() {
|
||||||
|
// const-eval will return "tainted" errors if e.g. the layout cannot
|
||||||
|
// be computed as the type references non-existing names.
|
||||||
|
// See <https://github.com/rust-lang/rust/issues/124348>.
|
||||||
|
} else {
|
||||||
|
// Looks like the const is not captued by `required_consts`, that's bad.
|
||||||
|
span_bug!(span, "interpret const eval failure of {val:?} which is not in required_consts");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
err.emit_note(*ecx.tcx);
|
err.emit_note(*ecx.tcx);
|
||||||
err
|
err
|
||||||
|
@ -66,6 +66,9 @@ impl ReportedErrorInfo {
|
|||||||
pub fn tainted_by_errors(error: ErrorGuaranteed) -> ReportedErrorInfo {
|
pub fn tainted_by_errors(error: ErrorGuaranteed) -> ReportedErrorInfo {
|
||||||
ReportedErrorInfo { is_tainted_by_errors: true, error }
|
ReportedErrorInfo { is_tainted_by_errors: true, error }
|
||||||
}
|
}
|
||||||
|
pub fn is_tainted_by_errors(&self) -> bool {
|
||||||
|
self.is_tainted_by_errors
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<ErrorGuaranteed> for ReportedErrorInfo {
|
impl From<ErrorGuaranteed> for ReportedErrorInfo {
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
//@ known-bug: #124348
|
|
||||||
enum Eek {
|
|
||||||
TheConst,
|
|
||||||
UnusedByTheConst(Sum),
|
|
||||||
}
|
|
||||||
|
|
||||||
const EEK_ZERO: &[Eek] = &[];
|
|
12
tests/ui/consts/erroneous_type_in_const_return_value.rs
Normal file
12
tests/ui/consts/erroneous_type_in_const_return_value.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
//! ICE test #124348
|
||||||
|
//! We should not be running const eval if the layout has errors.
|
||||||
|
|
||||||
|
enum Eek {
|
||||||
|
TheConst,
|
||||||
|
UnusedByTheConst(Sum),
|
||||||
|
//~^ ERROR cannot find type `Sum` in this scope
|
||||||
|
}
|
||||||
|
|
||||||
|
const EEK_ZERO: &[Eek] = &[];
|
||||||
|
|
||||||
|
fn main() {}
|
14
tests/ui/consts/erroneous_type_in_const_return_value.stderr
Normal file
14
tests/ui/consts/erroneous_type_in_const_return_value.stderr
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
error[E0412]: cannot find type `Sum` in this scope
|
||||||
|
--> $DIR/erroneous_type_in_const_return_value.rs:6:22
|
||||||
|
|
|
||||||
|
LL | UnusedByTheConst(Sum),
|
||||||
|
| ^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this trait
|
||||||
|
|
|
||||||
|
LL + use std::iter::Sum;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0412`.
|
14
tests/ui/consts/erroneous_type_in_promoted.rs
Normal file
14
tests/ui/consts/erroneous_type_in_promoted.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
//! ICE test #124348
|
||||||
|
//! We should not be running const eval if the layout has errors.
|
||||||
|
|
||||||
|
enum Eek {
|
||||||
|
TheConst,
|
||||||
|
UnusedByTheConst(Sum),
|
||||||
|
//~^ ERROR cannot find type `Sum` in this scope
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn foo() {
|
||||||
|
let x: &'static [Eek] = &[];
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
14
tests/ui/consts/erroneous_type_in_promoted.stderr
Normal file
14
tests/ui/consts/erroneous_type_in_promoted.stderr
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
error[E0412]: cannot find type `Sum` in this scope
|
||||||
|
--> $DIR/erroneous_type_in_promoted.rs:6:22
|
||||||
|
|
|
||||||
|
LL | UnusedByTheConst(Sum),
|
||||||
|
| ^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this trait
|
||||||
|
|
|
||||||
|
LL + use std::iter::Sum;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0412`.
|
Loading…
Reference in New Issue
Block a user