Skip to content

Commit 00345ad

Browse files
committed
Add an ErrorGuaranteed to ast::TyKind::Err.
This makes it more like `hir::TyKind::Err`, and avoids a `span_delayed_bug` call in `LoweringContext::lower_ty_direct`.
1 parent 417be5b commit 00345ad

File tree

12 files changed

+41
-31
lines changed

12 files changed

+41
-31
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2136,10 +2136,10 @@ pub enum TyKind {
21362136
ImplicitSelf,
21372137
/// A macro in the type position.
21382138
MacCall(P<MacCall>),
2139-
/// Placeholder for a kind that has failed to be defined.
2140-
Err,
21412139
/// Placeholder for a `va_list`.
21422140
CVarArgs,
2141+
/// Placeholder for a kind that has failed to be defined.
2142+
Err(ErrorGuaranteed),
21432143
}
21442144

21452145
impl TyKind {

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,11 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
481481
let Ty { id, kind, span, tokens } = ty.deref_mut();
482482
vis.visit_id(id);
483483
match kind {
484-
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err | TyKind::Never | TyKind::CVarArgs => {}
484+
TyKind::Infer
485+
| TyKind::ImplicitSelf
486+
| TyKind::Err(_)
487+
| TyKind::Never
488+
| TyKind::CVarArgs => {}
485489
TyKind::Slice(ty) => vis.visit_ty(ty),
486490
TyKind::Ptr(mt) => vis.visit_mt(mt),
487491
TyKind::Ref(lt, mt) => {
@@ -1649,7 +1653,7 @@ impl DummyAstNode for Ty {
16491653
fn dummy() -> Self {
16501654
Ty {
16511655
id: DUMMY_NODE_ID,
1652-
kind: TyKind::Err,
1656+
kind: TyKind::Tup(ThinVec::new()),
16531657
span: Default::default(),
16541658
tokens: Default::default(),
16551659
}

compiler/rustc_ast/src/visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) {
447447
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Impl);
448448
}
449449
TyKind::Typeof(expression) => visitor.visit_anon_const(expression),
450-
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err => {}
450+
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err(_) => {}
451451
TyKind::MacCall(mac) => visitor.visit_mac_call(mac),
452452
TyKind::Never | TyKind::CVarArgs => {}
453453
TyKind::AnonStruct(_, ref fields) | TyKind::AnonUnion(_, ref fields) => {

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12851285
fn lower_ty_direct(&mut self, t: &Ty, itctx: ImplTraitContext) -> hir::Ty<'hir> {
12861286
let kind = match &t.kind {
12871287
TyKind::Infer => hir::TyKind::Infer,
1288-
TyKind::Err => hir::TyKind::Err(self.dcx().has_errors().unwrap()),
1288+
TyKind::Err(guar) => hir::TyKind::Err(*guar),
12891289
// Lower the anonymous structs or unions in a nested lowering context.
12901290
//
12911291
// ```

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
881881
&item.vis,
882882
errors::VisibilityNotPermittedNote::TraitImpl,
883883
);
884-
if let TyKind::Err = self_ty.kind {
884+
if let TyKind::Err(_) = self_ty.kind {
885885
this.dcx().emit_err(errors::ObsoleteAuto { span: item.span });
886886
}
887887
if let (&Unsafe::Yes(span), &ImplPolarity::Negative(sp)) = (unsafety, polarity)

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ impl<'a> State<'a> {
10481048
ast::TyKind::Infer => {
10491049
self.word("_");
10501050
}
1051-
ast::TyKind::Err => {
1051+
ast::TyKind::Err(_) => {
10521052
self.popen();
10531053
self.word("/*ERROR*/");
10541054
self.pclose();

compiler/rustc_parse/src/parser/diagnostics.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ use std::ops::{Deref, DerefMut};
4646
use thin_vec::{thin_vec, ThinVec};
4747

4848
/// Creates a placeholder argument.
49-
pub(super) fn dummy_arg(ident: Ident) -> Param {
49+
pub(super) fn dummy_arg(ident: Ident, guar: ErrorGuaranteed) -> Param {
5050
let pat = P(Pat {
5151
id: ast::DUMMY_NODE_ID,
5252
kind: PatKind::Ident(BindingAnnotation::NONE, ident, None),
5353
span: ident.span,
5454
tokens: None,
5555
});
56-
let ty = Ty { kind: TyKind::Err, span: ident.span, id: ast::DUMMY_NODE_ID, tokens: None };
56+
let ty = Ty { kind: TyKind::Err(guar), span: ident.span, id: ast::DUMMY_NODE_ID, tokens: None };
5757
Param {
5858
attrs: AttrVec::default(),
5959
id: ast::DUMMY_NODE_ID,
@@ -1540,14 +1540,14 @@ impl<'a> Parser<'a> {
15401540
pub(super) fn maybe_recover_from_question_mark(&mut self, ty: P<Ty>) -> P<Ty> {
15411541
if self.token == token::Question {
15421542
self.bump();
1543-
self.dcx().emit_err(QuestionMarkInType {
1543+
let guar = self.dcx().emit_err(QuestionMarkInType {
15441544
span: self.prev_token.span,
15451545
sugg: QuestionMarkInTypeSugg {
15461546
left: ty.span.shrink_to_lo(),
15471547
right: self.prev_token.span,
15481548
},
15491549
});
1550-
self.mk_ty(ty.span.to(self.prev_token.span), TyKind::Err)
1550+
self.mk_ty(ty.span.to(self.prev_token.span), TyKind::Err(guar))
15511551
} else {
15521552
ty
15531553
}
@@ -2304,8 +2304,8 @@ impl<'a> Parser<'a> {
23042304

23052305
pub(super) fn recover_bad_self_param(&mut self, mut param: Param) -> PResult<'a, Param> {
23062306
let span = param.pat.span;
2307-
param.ty.kind = TyKind::Err;
2308-
self.dcx().emit_err(SelfParamNotFirst { span });
2307+
let guar = self.dcx().emit_err(SelfParamNotFirst { span });
2308+
param.ty.kind = TyKind::Err(guar);
23092309
Ok(param)
23102310
}
23112311

@@ -2437,7 +2437,7 @@ impl<'a> Parser<'a> {
24372437
pub(super) fn deduplicate_recovered_params_names(&self, fn_inputs: &mut ThinVec<Param>) {
24382438
let mut seen_inputs = FxHashSet::default();
24392439
for input in fn_inputs.iter_mut() {
2440-
let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err) =
2440+
let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err(_)) =
24412441
(&input.pat.kind, &input.ty.kind)
24422442
{
24432443
Some(*ident)
@@ -2644,8 +2644,10 @@ impl<'a> Parser<'a> {
26442644
"::",
26452645
Applicability::MaybeIncorrect,
26462646
);
2647-
err.emit();
2648-
return Ok(GenericArg::Type(self.mk_ty(start.to(expr.span), TyKind::Err)));
2647+
let guar = err.emit();
2648+
return Ok(GenericArg::Type(
2649+
self.mk_ty(start.to(expr.span), TyKind::Err(guar)),
2650+
));
26492651
} else if token::Comma == self.token.kind || self.token.kind.should_end_const_arg()
26502652
{
26512653
// Avoid the following output by checking that we consumed a full const arg:

compiler/rustc_parse/src/parser/item.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,8 @@ impl<'a> Parser<'a> {
591591
let ty_second = if self.token == token::DotDot {
592592
// We need to report this error after `cfg` expansion for compatibility reasons
593593
self.bump(); // `..`, do not add it to expected tokens
594-
Some(self.mk_ty(self.prev_token.span, TyKind::Err))
594+
let guar = self.dcx().span_delayed_bug(self.prev_token.span, "obsolete `..` syntax");
595+
Some(self.mk_ty(self.prev_token.span, TyKind::Err(guar)))
595596
} else if has_for || self.token.can_begin_type() {
596597
Some(self.parse_ty()?)
597598
} else {
@@ -2628,13 +2629,13 @@ impl<'a> Parser<'a> {
26282629
p.recover_diff_marker();
26292630
let snapshot = p.create_snapshot_for_diagnostic();
26302631
let param = p.parse_param_general(req_name, first_param).or_else(|e| {
2631-
e.emit();
2632+
let guar = e.emit();
26322633
let lo = p.prev_token.span;
26332634
p.restore_snapshot(snapshot);
26342635
// Skip every token until next possible arg or end.
26352636
p.eat_to_tokens(&[&token::Comma, &token::CloseDelim(Delimiter::Parenthesis)]);
26362637
// Create a placeholder argument for proper arg count (issue #34264).
2637-
Ok(dummy_arg(Ident::new(kw::Empty, lo.to(p.prev_token.span))))
2638+
Ok(dummy_arg(Ident::new(kw::Empty, lo.to(p.prev_token.span)), guar))
26382639
});
26392640
// ...now that we've parsed the first argument, `self` is no longer allowed.
26402641
first_param = false;
@@ -2671,8 +2672,8 @@ impl<'a> Parser<'a> {
26712672
return if let Some(ident) =
26722673
this.parameter_without_type(&mut err, pat, is_name_required, first_param)
26732674
{
2674-
err.emit();
2675-
Ok((dummy_arg(ident), TrailingToken::None))
2675+
let guar = err.emit();
2676+
Ok((dummy_arg(ident, guar), TrailingToken::None))
26762677
} else {
26772678
Err(err)
26782679
};

compiler/rustc_parse/src/parser/path.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,9 @@ impl<'a> Parser<'a> {
678678
c.into()
679679
}
680680
Some(GenericArg::Lifetime(lt)) => {
681-
self.dcx().emit_err(errors::AssocLifetime { span, lifetime: lt.ident.span });
682-
self.mk_ty(span, ast::TyKind::Err).into()
681+
let guar =
682+
self.dcx().emit_err(errors::AssocLifetime { span, lifetime: lt.ident.span });
683+
self.mk_ty(span, ast::TyKind::Err(guar)).into()
683684
}
684685
None => {
685686
let after_eq = eq.shrink_to_hi();
@@ -779,7 +780,7 @@ impl<'a> Parser<'a> {
779780
// type to determine if error recovery has occurred and if the input is not a
780781
// syntactically valid type after all.
781782
if let ast::TyKind::Slice(inner_ty) | ast::TyKind::Array(inner_ty, _) = &ty.kind
782-
&& let ast::TyKind::Err = inner_ty.kind
783+
&& let ast::TyKind::Err(_) = inner_ty.kind
783784
&& let Some(snapshot) = snapshot
784785
&& let Some(expr) =
785786
self.recover_unbraced_const_arg_that_can_begin_ty(snapshot)

compiler/rustc_parse/src/parser/ty.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,10 @@ impl<'a> Parser<'a> {
346346
AllowCVariadic::No => {
347347
// FIXME(Centril): Should we just allow `...` syntactically
348348
// anywhere in a type and use semantic restrictions instead?
349-
self.dcx().emit_err(NestedCVariadicType { span: lo.to(self.prev_token.span) });
350-
TyKind::Err
349+
let guar = self
350+
.dcx()
351+
.emit_err(NestedCVariadicType { span: lo.to(self.prev_token.span) });
352+
TyKind::Err(guar)
351353
}
352354
}
353355
} else {
@@ -493,8 +495,8 @@ impl<'a> Parser<'a> {
493495
{
494496
// Recover from `[LIT; EXPR]` and `[LIT]`
495497
self.bump();
496-
err.emit();
497-
self.mk_ty(self.prev_token.span, TyKind::Err)
498+
let guar = err.emit();
499+
self.mk_ty(self.prev_token.span, TyKind::Err(guar))
498500
}
499501
Err(err) => return Err(err),
500502
};

src/tools/clippy/clippy_utils/src/ast_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ pub fn eq_ty(l: &Ty, r: &Ty) -> bool {
690690
match (&l.kind, &r.kind) {
691691
(Paren(l), _) => eq_ty(l, r),
692692
(_, Paren(r)) => eq_ty(l, r),
693-
(Never, Never) | (Infer, Infer) | (ImplicitSelf, ImplicitSelf) | (Err, Err) | (CVarArgs, CVarArgs) => true,
693+
(Never, Never) | (Infer, Infer) | (ImplicitSelf, ImplicitSelf) | (Err(_), Err(_)) | (CVarArgs, CVarArgs) => true,
694694
(Slice(l), Slice(r)) => eq_ty(l, r),
695695
(Array(le, ls), Array(re, rs)) => eq_ty(le, re) && eq_expr(&ls.value, &rs.value),
696696
(Ptr(l), Ptr(r)) => l.mutbl == r.mutbl && eq_ty(&l.ty, &r.ty),

src/tools/rustfmt/src/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ impl Rewrite for ast::Ty {
859859
})
860860
}
861861
ast::TyKind::CVarArgs => Some("...".to_owned()),
862-
ast::TyKind::Err => Some(context.snippet(self.span).to_owned()),
862+
ast::TyKind::Err(_) => Some(context.snippet(self.span).to_owned()),
863863
ast::TyKind::Typeof(ref anon_const) => rewrite_call(
864864
context,
865865
"typeof",

0 commit comments

Comments
 (0)