Revert "Fix an ICE on an invalid `binding @ ...` in a tuple struct pattern"
This reverts commit f5e5eb6f46
.
This commit is contained in:
parent
438c59f010
commit
8b778a5f8d
|
@ -1510,30 +1510,20 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
||||||
pat_src: PatternSource,
|
pat_src: PatternSource,
|
||||||
bindings: &mut SmallVec<[(PatBoundCtx, FxHashSet<Ident>); 1]>,
|
bindings: &mut SmallVec<[(PatBoundCtx, FxHashSet<Ident>); 1]>,
|
||||||
) {
|
) {
|
||||||
let is_tuple_struct_pat = matches!(pat.kind, PatKind::TupleStruct(_, _));
|
|
||||||
|
|
||||||
// Visit all direct subpatterns of this pattern.
|
// Visit all direct subpatterns of this pattern.
|
||||||
pat.walk(&mut |pat| {
|
pat.walk(&mut |pat| {
|
||||||
debug!("resolve_pattern pat={:?} node={:?}", pat, pat.kind);
|
debug!("resolve_pattern pat={:?} node={:?}", pat, pat.kind);
|
||||||
match pat.kind {
|
match pat.kind {
|
||||||
PatKind::Ident(bmode, ident, ref sub) => {
|
PatKind::Ident(bmode, ident, ref sub) => {
|
||||||
if is_tuple_struct_pat && sub.as_ref().filter(|p| p.is_rest()).is_some() {
|
// First try to resolve the identifier as some existing entity,
|
||||||
// In tuple struct patterns ignore the invalid `ident @ ...`.
|
// then fall back to a fresh binding.
|
||||||
// It will be handled as an error by the AST lowering.
|
let has_sub = sub.is_some();
|
||||||
self.r
|
let res = self
|
||||||
.session
|
.try_resolve_as_non_binding(pat_src, pat, bmode, ident, has_sub)
|
||||||
.delay_span_bug(ident.span, "ident in tuple pattern is invalid");
|
.unwrap_or_else(|| {
|
||||||
} else {
|
self.fresh_binding(ident, pat.id, pat_src, bindings)
|
||||||
// First try to resolve the identifier as some existing entity,
|
});
|
||||||
// then fall back to a fresh binding.
|
self.r.record_partial_res(pat.id, PartialRes::new(res));
|
||||||
let has_sub = sub.is_some();
|
|
||||||
let res = self
|
|
||||||
.try_resolve_as_non_binding(pat_src, pat, bmode, ident, has_sub)
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
self.fresh_binding(ident, pat.id, pat_src, bindings)
|
|
||||||
});
|
|
||||||
self.r.record_partial_res(pat.id, PartialRes::new(res));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
PatKind::TupleStruct(ref path, ..) => {
|
PatKind::TupleStruct(ref path, ..) => {
|
||||||
self.smart_resolve_path(pat.id, None, path, PathSource::TupleStruct(pat.span));
|
self.smart_resolve_path(pat.id, None, path, PathSource::TupleStruct(pat.span));
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
enum E {
|
|
||||||
A(u8, u8),
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let e = E::A(2, 3);
|
|
||||||
match e {
|
|
||||||
E::A(x @ ..) => { //~ ERROR `x @` is not allowed in a tuple
|
|
||||||
x //~ ERROR cannot find value `x` in this scope
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
error[E0425]: cannot find value `x` in this scope
|
|
||||||
--> $DIR/issue-74539.rs:9:13
|
|
||||||
|
|
|
||||||
LL | x
|
|
||||||
| ^ help: a local variable with a similar name exists: `e`
|
|
||||||
|
|
||||||
error: `x @` is not allowed in a tuple struct
|
|
||||||
--> $DIR/issue-74539.rs:8:14
|
|
||||||
|
|
|
||||||
LL | E::A(x @ ..) => {
|
|
||||||
| ^^^^^^ this is only allowed in slice patterns
|
|
||||||
|
|
|
||||||
= help: remove this and bind each tuple field independently
|
|
||||||
help: if you don't need to use the contents of x, discard the tuple's remaining fields
|
|
||||||
|
|
|
||||||
LL | E::A(..) => {
|
|
||||||
| ^^
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0425`.
|
|
Loading…
Reference in New Issue