diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2024-11-06 19:46:54 +0000 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2024-11-17 23:39:59 +0000 |
| commit | ff2f7a7a834843ea74b1e7d6511eb4ad06f43981 (patch) | |
| tree | 02dbd4c88983284bfa68a5d7452f1e6262a17724 /compiler/rustc_middle | |
| parent | 917a50a03931a9861c19a46f3e2a02a28f1da936 (diff) | |
| download | rust-ff2f7a7a834843ea74b1e7d6511eb4ad06f43981.tar.gz rust-ff2f7a7a834843ea74b1e7d6511eb4ad06f43981.zip | |
Point at `const` definition when used instead of a binding in a `let` statement
After: ``` error[E0005]: refutable pattern in local binding --> $DIR/bad-pattern.rs:19:13 | LL | const PAT: u32 = 0; | -------------- missing patterns are not covered because `PAT` is interpreted as a constant pattern, not a new variable ... LL | let PAT = v1; | ^^^ | | | pattern `1_u32..=u32::MAX` not covered | help: introduce a variable instead: `PAT_var` | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html = note: the matched value is of type `u32` ``` Before: ``` error[E0005]: refutable pattern in local binding --> $DIR/bad-pattern.rs:19:13 | LL | let PAT = v1; | ^^^ | | | pattern `1_u32..=u32::MAX` not covered | missing patterns are not covered because `PAT` is interpreted as a constant pattern, not a new variable | help: introduce a variable instead: `PAT_var` | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html = note: the matched value is of type `u32` ```
Diffstat (limited to 'compiler/rustc_middle')
| -rw-r--r-- | compiler/rustc_middle/src/thir.rs | 11 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/thir/visit.rs | 2 |
2 files changed, 10 insertions, 3 deletions
diff --git a/compiler/rustc_middle/src/thir.rs b/compiler/rustc_middle/src/thir.rs index 45ceb0a555d..821f8c99704 100644 --- a/compiler/rustc_middle/src/thir.rs +++ b/compiler/rustc_middle/src/thir.rs @@ -640,6 +640,7 @@ impl<'tcx> Pat<'tcx> { | Range(..) | Binding { subpattern: None, .. } | Constant { .. } + | NamedConstant { .. } | Error(_) => {} AscribeUserType { subpattern, .. } | Binding { subpattern: Some(subpattern), .. } @@ -788,6 +789,12 @@ pub enum PatKind<'tcx> { value: mir::Const<'tcx>, }, + /// Same as `Constant`, but that came from a `const` that we can point at in diagnostics. + NamedConstant { + value: mir::Const<'tcx>, + span: Span, + }, + /// Inline constant found while lowering a pattern. InlineConstant { /// [LocalDefId] of the constant, we need this so that we have a @@ -1084,8 +1091,8 @@ mod size_asserts { static_assert_size!(Block, 48); static_assert_size!(Expr<'_>, 64); static_assert_size!(ExprKind<'_>, 40); - static_assert_size!(Pat<'_>, 64); - static_assert_size!(PatKind<'_>, 48); + static_assert_size!(Pat<'_>, 72); + static_assert_size!(PatKind<'_>, 56); static_assert_size!(Stmt<'_>, 48); static_assert_size!(StmtKind<'_>, 48); // tidy-alphabetical-end diff --git a/compiler/rustc_middle/src/thir/visit.rs b/compiler/rustc_middle/src/thir/visit.rs index 36f0e3d890c..759ed77dbcb 100644 --- a/compiler/rustc_middle/src/thir/visit.rs +++ b/compiler/rustc_middle/src/thir/visit.rs @@ -246,7 +246,7 @@ pub fn walk_pat<'thir, 'tcx: 'thir, V: Visitor<'thir, 'tcx>>( visitor.visit_pat(&subpattern.pattern); } } - Constant { value: _ } => {} + Constant { value: _ } | NamedConstant { value: _, span: _ } => {} InlineConstant { def: _, subpattern } => visitor.visit_pat(subpattern), Range(_) => {} Slice { prefix, slice, suffix } | Array { prefix, slice, suffix } => { |
