Skip to content

Commit 7889e99

Browse files
committed
Add PatKind::Err
1 parent 6ed31ab commit 7889e99

File tree

23 files changed

+66
-24
lines changed

23 files changed

+66
-24
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,8 @@ impl Pat {
625625
| PatKind::Range(..)
626626
| PatKind::Ident(..)
627627
| PatKind::Path(..)
628-
| PatKind::MacCall(_) => {}
628+
| PatKind::MacCall(_)
629+
| PatKind::Err(_) => {}
629630
}
630631
}
631632

@@ -809,6 +810,9 @@ pub enum PatKind {
809810

810811
/// A macro pattern; pre-expansion.
811812
MacCall(P<MacCall>),
813+
814+
/// Placeholder for a pattern that wasn't syntactically well formed in some way.
815+
Err(ErrorGuaranteed),
812816
}
813817

814818
/// Whether the `..` is present in a struct fields pattern.

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,7 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
12671267
let Pat { id, kind, span, tokens } = pat.deref_mut();
12681268
vis.visit_id(id);
12691269
match kind {
1270-
PatKind::Wild | PatKind::Rest | PatKind::Never => {}
1270+
PatKind::Wild | PatKind::Rest | PatKind::Never | PatKind::Err(_) => {}
12711271
PatKind::Ident(_binding_mode, ident, sub) => {
12721272
vis.visit_ident(ident);
12731273
visit_opt(sub, |sub| vis.visit_pat(sub));

compiler/rustc_ast/src/visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
568568
walk_list!(visitor, visit_expr, lower_bound);
569569
walk_list!(visitor, visit_expr, upper_bound);
570570
}
571-
PatKind::Wild | PatKind::Rest | PatKind::Never => {}
571+
PatKind::Wild | PatKind::Rest | PatKind::Never | PatKind::Err(_) => {}
572572
PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => {
573573
walk_list!(visitor, visit_pat, elems);
574574
}

compiler/rustc_ast_lowering/src/pat.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
109109
// return inner to be processed in next loop
110110
PatKind::Paren(inner) => pattern = inner,
111111
PatKind::MacCall(_) => panic!("{:?} shouldn't exist here", pattern.span),
112+
PatKind::Err(guar) => break hir::PatKind::Err(*guar),
112113
}
113114
};
114115

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1519,6 +1519,11 @@ impl<'a> State<'a> {
15191519
self.pclose();
15201520
}
15211521
PatKind::MacCall(m) => self.print_mac(m),
1522+
PatKind::Err(_) => {
1523+
self.popen();
1524+
self.word("/*ERROR*/");
1525+
self.pclose();
1526+
}
15221527
}
15231528
self.ann.post(self, AnnNode::Pat(pat))
15241529
}

compiler/rustc_hir/src/hir.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ impl<'hir> Pat<'hir> {
10151015

10161016
use PatKind::*;
10171017
match self.kind {
1018-
Wild | Never | Lit(_) | Range(..) | Binding(.., None) | Path(_) => true,
1018+
Wild | Never | Lit(_) | Range(..) | Binding(.., None) | Path(_) | Err(_) => true,
10191019
Box(s) | Ref(s, _) | Binding(.., Some(s)) => s.walk_short_(it),
10201020
Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk_short_(it)),
10211021
TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().all(|p| p.walk_short_(it)),
@@ -1042,7 +1042,7 @@ impl<'hir> Pat<'hir> {
10421042

10431043
use PatKind::*;
10441044
match self.kind {
1045-
Wild | Never | Lit(_) | Range(..) | Binding(.., None) | Path(_) => {}
1045+
Wild | Never | Lit(_) | Range(..) | Binding(.., None) | Path(_) | Err(_) => {}
10461046
Box(s) | Ref(s, _) | Binding(.., Some(s)) => s.walk_(it),
10471047
Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk_(it)),
10481048
TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().for_each(|p| p.walk_(it)),
@@ -1205,6 +1205,9 @@ pub enum PatKind<'hir> {
12051205
/// PatKind::Slice([Binding(a), Binding(b)], Some(Wild), [Binding(c), Binding(d)])
12061206
/// ```
12071207
Slice(&'hir [Pat<'hir>], Option<&'hir Pat<'hir>>, &'hir [Pat<'hir>]),
1208+
1209+
/// A placeholder for a pattern that wasn't well formed in some way.
1210+
Err(ErrorGuaranteed),
12081211
}
12091212

12101213
/// A statement.

compiler/rustc_hir/src/intravisit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat<'v>) {
655655
walk_list!(visitor, visit_expr, lower_bound);
656656
walk_list!(visitor, visit_expr, upper_bound);
657657
}
658-
PatKind::Never | PatKind::Wild => (),
658+
PatKind::Never | PatKind::Wild | PatKind::Err(_) => (),
659659
PatKind::Slice(prepatterns, ref slice_pattern, postpatterns) => {
660660
walk_list!(visitor, visit_pat, prepatterns);
661661
walk_list!(visitor, visit_pat, slice_pattern);

compiler/rustc_hir_analysis/src/check/region.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,8 @@ fn resolve_local<'tcx>(
681681
| PatKind::Never
682682
| PatKind::Path(_)
683683
| PatKind::Lit(_)
684-
| PatKind::Range(_, _, _) => false,
684+
| PatKind::Range(_, _, _)
685+
| PatKind::Err(_) => false,
685686
}
686687
}
687688

compiler/rustc_hir_pretty/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,6 +1838,11 @@ impl<'a> State<'a> {
18381838
self.commasep(Inconsistent, after, |s, p| s.print_pat(p));
18391839
self.word("]");
18401840
}
1841+
PatKind::Err(_) => {
1842+
self.popen();
1843+
self.word("/*ERROR*/");
1844+
self.pclose();
1845+
}
18411846
}
18421847
self.ann.post(self, AnnNode::Pat(pat))
18431848
}

compiler/rustc_hir_typeck/src/expr_use_visitor.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,11 +458,15 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
458458
needs_to_be_read = true;
459459
}
460460
}
461-
PatKind::Or(_) | PatKind::Box(_) | PatKind::Ref(..) | PatKind::Wild => {
461+
PatKind::Or(_)
462+
| PatKind::Box(_)
463+
| PatKind::Ref(..)
464+
| PatKind::Wild
465+
| PatKind::Err(_) => {
462466
// If the PatKind is Or, Box, or Ref, the decision is made later
463467
// as these patterns contains subpatterns
464-
// If the PatKind is Wild, the decision is made based on the other patterns being
465-
// examined
468+
// If the PatKind is Wild or Err, the decision is made based on the other patterns
469+
// being examined
466470
}
467471
}
468472
})?

0 commit comments

Comments
 (0)