mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-16 05:56:56 +00:00
![]() "Missing" patterns are possible in bare fn types (`fn f(u32)`) and similar places. Currently these are represented in the AST with `ast::PatKind::Ident` with no `by_ref`, no `mut`, an empty ident, and no sub-pattern. This flows through to `{hir,thir}::PatKind::Binding` for HIR and THIR. This is a bit nasty. It's very non-obvious, and easy to forget to check for the exceptional empty identifier case. This commit adds a new variant, `PatKind::Missing`, to do it properly. The process I followed: - Add a `Missing` variant to `{ast,hir,thir}::PatKind`. - Chang `parse_param_general` to produce `ast::PatKind::Missing` instead of `ast::PatKind::Missing`. - Look through `kw::Empty` occurrences to find functions where an existing empty ident check needs replacing with a `PatKind::Missing` check: `print_param`, `check_trait_item`, `is_named_param`. - Add a `PatKind::Missing => unreachable!(),` arm to every exhaustive match identified by the compiler. - Find which arms are actually reachable by running the test suite, changing them to something appropriate, usually by looking at what would happen to a `PatKind::Ident`/`PatKind::Binding` with no ref, no `mut`, an empty ident, and no subpattern. Quite a few of the `unreachable!()` arms were never reached. This makes sense because `PatKind::Missing` can't happen in every pattern, only in places like bare fn tys and trait fn decls. I also tried an alternative approach: modifying `ast::Param::pat` to hold an `Option<P<Pat>>` instead of a `P<Pat>`, but that quickly turned into a very large and painful change. Adding `PatKind::Missing` is much easier. |
||
---|---|---|
.. | ||
auxiliary | ||
ast-const-trait-bound.rs | ||
ast-const-trait-bound.stdout | ||
avoid-crash.rs | ||
avoid-crash.stderr | ||
bad-literal.rs | ||
bad-literal.stderr | ||
bad-literal.stdout | ||
box.rs | ||
box.stdout | ||
debug-fmt-hir.rs | ||
debug-fmt-hir.stdout | ||
deprecated-attr.rs | ||
deprecated-attr.stdout | ||
diagnostic-attr.rs | ||
diagnostic-attr.stdout | ||
expanded-exhaustive.rs | ||
expanded-exhaustive.stdout | ||
expanded-interpolation.rs | ||
expanded-interpolation.stdout | ||
extern-static.rs | ||
extern-static.stdout | ||
flattened-format-args.rs | ||
flattened-format-args.stdout | ||
hir-tree.rs | ||
let-else-hir.rs | ||
let-else-hir.stdout | ||
mir-unpretty.rs | ||
mir-unpretty.stderr | ||
self-hir.rs | ||
self-hir.stdout | ||
staged-api-invalid-path-108697.rs | ||
staged-api-invalid-path-108697.stderr | ||
unpretty-expr-fn-arg.rs | ||
unpretty-expr-fn-arg.stdout | ||
unsafe-attr.rs | ||
unsafe-attr.stdout |