Skip to content

Commit aaa82ba

Browse files
committed
Enforce ErrorGuaranteed for silencing resolve errors
1 parent 40e1a46 commit aaa82ba

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

Diff for: compiler/rustc_parse/src/parser/expr.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -2480,9 +2480,9 @@ impl<'a> Parser<'a> {
24802480

24812481
let mut checker = CondChecker::new(self);
24822482
checker.visit_expr(&mut cond);
2483-
if checker.seen_missing_let {
2483+
if checker.seen_missing_let.is_some() {
24842484
// Avoid unnecessary resolve errors as we know we'll have some.
2485-
*self.sess.silence_resolve_errors.borrow_mut() = true;
2485+
*self.sess.silence_resolve_errors.borrow_mut() = checker.seen_missing_let;
24862486
}
24872487
self.sess.silence_missing_comparison.borrow_mut().append(&mut checker.seen_comparison);
24882488

@@ -3562,7 +3562,7 @@ struct CondChecker<'a> {
35623562
parser: &'a Parser<'a>,
35633563
forbid_let_reason: Option<ForbiddenLetReason>,
35643564
missing_let: Option<errors::MaybeMissingLet>,
3565-
seen_missing_let: bool,
3565+
seen_missing_let: Option<ErrorGuaranteed>,
35663566
comparison: Option<errors::MaybeComparison>,
35673567
seen_comparison: Vec<Span>,
35683568
}
@@ -3573,7 +3573,7 @@ impl<'a> CondChecker<'a> {
35733573
parser,
35743574
forbid_let_reason: None,
35753575
missing_let: None,
3576-
seen_missing_let: false,
3576+
seen_missing_let: None,
35773577
comparison: None,
35783578
seen_comparison: vec![],
35793579
}
@@ -3591,13 +3591,16 @@ impl MutVisitor for CondChecker<'_> {
35913591
if let Some(comparison) = self.comparison {
35923592
self.seen_comparison.push(comparison.span);
35933593
}
3594-
*is_recovered =
3595-
Some(self.parser.sess.emit_err(errors::ExpectedExpressionFoundLet {
3596-
span,
3597-
reason,
3598-
missing_let: self.missing_let,
3599-
comparison: self.comparison,
3600-
}));
3594+
let error = self.parser.sess.emit_err(errors::ExpectedExpressionFoundLet {
3595+
span,
3596+
reason,
3597+
missing_let: self.missing_let,
3598+
comparison: self.comparison,
3599+
});
3600+
*is_recovered = Some(error);
3601+
if self.missing_let.is_some() {
3602+
self.seen_missing_let = Some(error);
3603+
}
36013604
} else {
36023605
self.parser.sess.gated_spans.gate(sym::let_chains, span);
36033606
}
@@ -3631,7 +3634,6 @@ impl MutVisitor for CondChecker<'_> {
36313634
| ExprKind::Call(_, _)
36323635
| ExprKind::Array(_) = rhs.kind
36333636
{
3634-
self.seen_missing_let = true;
36353637
self.missing_let =
36363638
Some(errors::MaybeMissingLet { span: rhs.span.shrink_to_lo() });
36373639
}

Diff for: compiler/rustc_resolve/src/late/diagnostics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
435435
code,
436436
);
437437

438-
if *self.r.tcx.sess.parse_sess.silence_resolve_errors.borrow() {
438+
if self.r.tcx.sess.parse_sess.silence_resolve_errors.borrow().is_some() {
439439
// Silence redundant resolve errors that will be caused due to mis-parse fallout.
440440
err.delay_as_bug();
441441
}

Diff for: compiler/rustc_session/src/parse.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,9 @@ pub struct ParseSess {
217217
pub proc_macro_quoted_spans: AppendOnlyVec<Span>,
218218
/// Used to generate new `AttrId`s. Every `AttrId` is unique.
219219
pub attr_id_generator: AttrIdGenerator,
220-
/// Track parse errors that will cause unnecessary resolve errors. This is a crude mechanism,
220+
/// Track parse errors that will cause unnecessary resolve errors. This is a crude mechanism,
221221
/// we should do something that is scope-based, instead of crate-global.
222-
pub silence_resolve_errors: Lock<bool>,
222+
pub silence_resolve_errors: Lock<Option<ErrorGuaranteed>>,
223223
/// Track parse errors that suggests changing an assignment to be an equality check.
224224
pub silence_missing_comparison: Lock<Vec<Span>>,
225225
}

0 commit comments

Comments
 (0)