From 0959f0f912c1029f0dfd3de431786433211a1f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 26 Jan 2021 11:24:43 -0800 Subject: [PATCH] Tweak suggestion for missing field in patterns Account for parser recovered struct and tuple patterns to avoid invalid suggestion. Follow up to #81103. --- compiler/rustc_typeck/src/check/pat.rs | 25 ++++++------------- .../struct_destructure_fail.stderr | 8 +++--- src/test/ui/error-codes/E0027.stderr | 12 ++++----- .../structs/struct-pat-derived-error.stderr | 4 +-- 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/compiler/rustc_typeck/src/check/pat.rs b/compiler/rustc_typeck/src/check/pat.rs index 79234f076acd1..1c1f7f7886fcd 100644 --- a/compiler/rustc_typeck/src/check/pat.rs +++ b/compiler/rustc_typeck/src/check/pat.rs @@ -1525,24 +1525,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { _ => return err, }, [.., field] => { - // if last field has a trailing comma, use the comma - // as the span to avoid trailing comma in ultimate - // suggestion (Issue #78511) - let tail = field.span.shrink_to_hi().until(pat.span.shrink_to_hi()); - let tail_through_comma = self.tcx.sess.source_map().span_through_char(tail, ','); - let sp = if tail_through_comma == tail { - field.span.shrink_to_hi() - } else { - tail_through_comma - }; - ( - match pat.kind { - PatKind::Struct(_, [_, ..], _) => ", ", - _ => "", - }, - "", - sp, - ) + // Account for last field having a trailing comma or parse recovery at the tail of + // the pattern to avoid invalid suggestion (#78511). + let tail = field.span.shrink_to_hi().with_hi(pat.span.hi()); + match &pat.kind { + PatKind::Struct(..) => (", ", " }", tail), + _ => return err, + } } }; err.span_suggestion( diff --git a/src/test/ui/destructuring-assignment/struct_destructure_fail.stderr b/src/test/ui/destructuring-assignment/struct_destructure_fail.stderr index c0955ef8b065a..8a83e145ea2d0 100644 --- a/src/test/ui/destructuring-assignment/struct_destructure_fail.stderr +++ b/src/test/ui/destructuring-assignment/struct_destructure_fail.stderr @@ -32,12 +32,12 @@ LL | Struct { a, _ } = Struct { a: 1, b: 2 }; | help: include the missing field in the pattern | -LL | Struct { a, b _ } = Struct { a: 1, b: 2 }; - | ^^^ +LL | Struct { a, b } = Struct { a: 1, b: 2 }; + | ^^^^^ help: if you don't care about this missing field, you can explicitly ignore it | -LL | Struct { a, .. _ } = Struct { a: 1, b: 2 }; - | ^^^^ +LL | Struct { a, .. } = Struct { a: 1, b: 2 }; + | ^^^^^^ error: aborting due to 5 previous errors diff --git a/src/test/ui/error-codes/E0027.stderr b/src/test/ui/error-codes/E0027.stderr index 694bbc358fee2..a3dd6910be4a5 100644 --- a/src/test/ui/error-codes/E0027.stderr +++ b/src/test/ui/error-codes/E0027.stderr @@ -7,11 +7,11 @@ LL | Dog { age: x } => {} help: include the missing field in the pattern | LL | Dog { age: x, name } => {} - | ^^^^^^ + | ^^^^^^^^ help: if you don't care about this missing field, you can explicitly ignore it | LL | Dog { age: x, .. } => {} - | ^^^^ + | ^^^^^^ error[E0027]: pattern does not mention field `age` --> $DIR/E0027.rs:15:9 @@ -22,11 +22,11 @@ LL | Dog { name: x, } => {} help: include the missing field in the pattern | LL | Dog { name: x, age } => {} - | ^^^^^ + | ^^^^^^^ help: if you don't care about this missing field, you can explicitly ignore it | LL | Dog { name: x, .. } => {} - | ^^^^ + | ^^^^^^ error[E0027]: pattern does not mention field `age` --> $DIR/E0027.rs:19:9 @@ -37,11 +37,11 @@ LL | Dog { name: x , } => {} help: include the missing field in the pattern | LL | Dog { name: x, age } => {} - | ^^^^^ + | ^^^^^^^ help: if you don't care about this missing field, you can explicitly ignore it | LL | Dog { name: x, .. } => {} - | ^^^^ + | ^^^^^^ error[E0027]: pattern does not mention fields `name`, `age` --> $DIR/E0027.rs:22:9 diff --git a/src/test/ui/structs/struct-pat-derived-error.stderr b/src/test/ui/structs/struct-pat-derived-error.stderr index 921d060faa38b..c1a95636d34cb 100644 --- a/src/test/ui/structs/struct-pat-derived-error.stderr +++ b/src/test/ui/structs/struct-pat-derived-error.stderr @@ -19,11 +19,11 @@ LL | let A { x, y } = self.d; help: include the missing fields in the pattern | LL | let A { x, y, b, c } = self.d; - | ^^^^^^ + | ^^^^^^^^ help: if you don't care about these missing fields, you can explicitly ignore them | LL | let A { x, y, .. } = self.d; - | ^^^^ + | ^^^^^^ error: aborting due to 3 previous errors