Allow errors to abort const checking when emitted
This is a hack for parity with `qualify_min_const_fn`, which only emitted a single error.
This commit is contained in:
parent
7fb9587a3c
commit
bfc10a89c3
@ -62,6 +62,8 @@ pub enum Status {
|
|||||||
|
|
||||||
/// An operation that is not *always* allowed in a const context.
|
/// An operation that is not *always* allowed in a const context.
|
||||||
pub trait NonConstOp: std::fmt::Debug {
|
pub trait NonConstOp: std::fmt::Debug {
|
||||||
|
const STOPS_CONST_CHECKING: bool = false;
|
||||||
|
|
||||||
/// Returns an enum indicating whether this operation is allowed within the given item.
|
/// Returns an enum indicating whether this operation is allowed within the given item.
|
||||||
fn status_in_item(&self, _ccx: &ConstCx<'_, '_>) -> Status {
|
fn status_in_item(&self, _ccx: &ConstCx<'_, '_>) -> Status {
|
||||||
Status::Forbidden
|
Status::Forbidden
|
||||||
|
@ -176,6 +176,8 @@ pub struct Validator<'mir, 'tcx> {
|
|||||||
|
|
||||||
/// The span of the current statement.
|
/// The span of the current statement.
|
||||||
span: Span,
|
span: Span,
|
||||||
|
|
||||||
|
const_checking_stopped: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for Validator<'mir, 'tcx> {
|
impl Deref for Validator<'mir, 'tcx> {
|
||||||
@ -188,7 +190,12 @@ impl Deref for Validator<'mir, 'tcx> {
|
|||||||
|
|
||||||
impl Validator<'mir, 'tcx> {
|
impl Validator<'mir, 'tcx> {
|
||||||
pub fn new(ccx: &'mir ConstCx<'mir, 'tcx>) -> Self {
|
pub fn new(ccx: &'mir ConstCx<'mir, 'tcx>) -> Self {
|
||||||
Validator { span: ccx.body.span, ccx, qualifs: Default::default() }
|
Validator {
|
||||||
|
span: ccx.body.span,
|
||||||
|
ccx,
|
||||||
|
qualifs: Default::default(),
|
||||||
|
const_checking_stopped: false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn check_body(&mut self) {
|
pub fn check_body(&mut self) {
|
||||||
@ -226,13 +233,22 @@ impl Validator<'mir, 'tcx> {
|
|||||||
|
|
||||||
/// Emits an error if an expression cannot be evaluated in the current context.
|
/// Emits an error if an expression cannot be evaluated in the current context.
|
||||||
pub fn check_op(&mut self, op: impl NonConstOp) {
|
pub fn check_op(&mut self, op: impl NonConstOp) {
|
||||||
ops::non_const(self.ccx, op, self.span);
|
self.check_op_spanned(op, self.span);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Emits an error at the given `span` if an expression cannot be evaluated in the current
|
/// Emits an error at the given `span` if an expression cannot be evaluated in the current
|
||||||
/// context.
|
/// context.
|
||||||
pub fn check_op_spanned(&mut self, op: impl NonConstOp, span: Span) {
|
pub fn check_op_spanned<O: NonConstOp>(&mut self, op: O, span: Span) {
|
||||||
ops::non_const(self.ccx, op, span);
|
// HACK: This is for strict equivalence with the old `qualify_min_const_fn` pass, which
|
||||||
|
// only emitted one error per function. It should be removed and the test output updated.
|
||||||
|
if self.const_checking_stopped {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let err_emitted = ops::non_const(self.ccx, op, span);
|
||||||
|
if err_emitted && O::STOPS_CONST_CHECKING {
|
||||||
|
self.const_checking_stopped = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_static(&mut self, def_id: DefId, span: Span) {
|
fn check_static(&mut self, def_id: DefId, span: Span) {
|
||||||
|
Loading…
Reference in New Issue
Block a user