Skip to content

Commit

Permalink
Allow errors to abort const checking when emitted
Browse files Browse the repository at this point in the history
This is a hack for parity with `qualify_min_const_fn`, which only
emitted a single error.
  • Loading branch information
ecstatic-morse committed Sep 22, 2020
1 parent 7fb9587 commit bfc10a8
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
2 changes: 2 additions & 0 deletions compiler/rustc_mir/src/transform/check_consts/ops.rs
Expand Up @@ -62,6 +62,8 @@ pub enum Status {

/// An operation that is not *always* allowed in a const context.
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.
fn status_in_item(&self, _ccx: &ConstCx<'_, '_>) -> Status {
Status::Forbidden
Expand Down
24 changes: 20 additions & 4 deletions compiler/rustc_mir/src/transform/check_consts/validation.rs
Expand Up @@ -176,6 +176,8 @@ pub struct Validator<'mir, 'tcx> {

/// The span of the current statement.
span: Span,

const_checking_stopped: bool,
}

impl Deref for Validator<'mir, 'tcx> {
Expand All @@ -188,7 +190,12 @@ impl Deref for Validator<'mir, 'tcx> {

impl Validator<'mir, 'tcx> {
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) {
Expand Down Expand Up @@ -226,13 +233,22 @@ impl Validator<'mir, 'tcx> {

/// Emits an error if an expression cannot be evaluated in the current context.
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
/// context.
pub fn check_op_spanned(&mut self, op: impl NonConstOp, span: Span) {
ops::non_const(self.ccx, op, span);
pub fn check_op_spanned<O: NonConstOp>(&mut self, op: O, span: 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) {
Expand Down

0 comments on commit bfc10a8

Please sign in to comment.