Revert "Fix an ICE on an invalid `binding @ ...` in a tuple struct pattern"

This reverts commit f5e5eb6f46.
This commit is contained in:
Yuki Okushi 2020-07-31 06:52:00 +09:00
parent 438c59f010
commit 8b778a5f8d
No known key found for this signature in database
GPG Key ID: B0986C85C0E2DAA1
3 changed files with 9 additions and 52 deletions

View File

@ -1510,20 +1510,11 @@ 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() {
// In tuple struct patterns ignore the invalid `ident @ ...`.
// It will be handled as an error by the AST lowering.
self.r
.session
.delay_span_bug(ident.span, "ident in tuple pattern is invalid");
} else {
// First try to resolve the identifier as some existing entity, // First try to resolve the identifier as some existing entity,
// then fall back to a fresh binding. // then fall back to a fresh binding.
let has_sub = sub.is_some(); let has_sub = sub.is_some();
@ -1534,7 +1525,6 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
}); });
self.r.record_partial_res(pat.id, PartialRes::new(res)); 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));
} }

View File

@ -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
}
};
}

View File

@ -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`.