Change:
<!-- Thank you for filing a bug report! Please provide a short summary of the bug, along with any information you feel relevant to replicating the bug. If you cannot produce a minimal reproduction case (something that would work in isolation), please provide the steps or even link to a repository that causes the problematic output to occur. --Given the following code: <!-- Please provide a link to --The current output is: We shouldn't show here. <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
without
another one 
What ideal output would you suggest? Should we remove the suggestion line like:
Ideally we should be checking that the return type . If it's not suggestable, don't mention it.
claim
I actually believe that neither the E0029 nor the E0277 should have been emitted. I would check explicitly for and change the error to be (that way the error isn't printed out, but rustc will ICE if no other error is emitted, which should have happened).
The PR will prevent E0029 and E0277 from printing out after checking the type references.

Discussion:
(lhs, Some((true, rhs_ty, rhs_sp))) => one_side_err(rhs_sp, rhs_ty, lhs), _ => span_bug!(span, "Impossible, verified above."), } <ins> if (lhs, rhs).references_error() { err.downgrade_to_delayed_bug(); } </ins> if self.tcx.sess.teach(&err.get_code().unwrap()) { err.note( "In a match expression, only numbers and characters can be matched 

self.note_obligation_cause(&mut err, &obligation); self.point_at_returns_when_relevant(&mut err, &obligation); err.emit(); } }

fn point_at_returns_when_relevant( &self, <del> err: &mut Diagnostic, </del> <ins> err: &mut DiagnosticBuilder<'tcx, ErrorGuaranteed>, </ins> obligation: &PredicateObligation<'tcx>, );

fn point_at_returns_when_relevant( &self, <del> err: &mut Diagnostic, </del> <ins> err: &mut DiagnosticBuilder<'tcx, ErrorGuaranteed>, </ins> obligation: &PredicateObligation<'tcx>, ) { match obligation.cause.code().peel_derives() {

for expr in &visitor.returns { if let Some(returned_ty) = typeck_results.node_type_opt(expr.hir_id) { let ty = self.resolve_vars_if_possible(returned_ty); <del> err.span_label(expr.span, &format!("this returned value is of type `{}`", ty)); </del> <ins> if ty.references_error() { // don't print out the [type error] here err.delay_as_bug(); } else { err.span_label( expr.span, &format!("this returned value is of type `{}`", ty), ); } </ins> } } }

<ins> fn digit() -> str { return {}; //~^ ERROR: mismatched types [E0308] } fn main() { let [_y..] = [box 1, box 2]; //~^ ERROR: cannot find value `_y` in this scope [E0425] //~| ERROR: `X..` patterns in slices are experimental [E0658] //~| ERROR: box expression syntax is experimental; you can call `Box::new` instead [E0658] //~| ERROR: box expression syntax is experimental; you can call `Box::new` instead [E0658] //~| ERROR: pattern requires 1 element but array has 2 [E0527] } </ins>

<ins> error[E0425]: cannot find value `_y` in this scope --> $DIR/issue-105946.rs:6:10 | LL |     let [_y..] = [box 1, box 2]; |          ^^ not found in this scope error[E0658]: `X..` patterns in slices are experimental --> $DIR/issue-105946.rs:6:10 | LL |     let [_y..] = [box 1, box 2]; |          ^^^^ | = note: see issue #67264 <https://github.com/rust-lang/rust/issues/67264> for more information = help: add `#![feature(half_open_range_patterns_in_slices)]` to the crate attributes to enable error[E0658]: box expression syntax is experimental; you can call `Box::new` instead --> $DIR/issue-105946.rs:6:19 | LL |     let [_y..] = [box 1, box 2]; |                   ^^^^^ | = note: see issue #49733 <https://github.com/rust-lang/rust/issues/49733> for more information = help: add `#![feature(box_syntax)]` to the crate attributes to enable error[E0658]: box expression syntax is experimental; you can call `Box::new` instead --> $DIR/issue-105946.rs:6:26 | LL |     let [_y..] = [box 1, box 2]; |                          ^^^^^ | = note: see issue #49733 <https://github.com/rust-lang/rust/issues/49733> for more information = help: add `#![feature(box_syntax)]` to the crate attributes to enable error[E0308]: mismatched types --> $DIR/issue-105946.rs:2:10 | LL |   return {}; |          ^^ expected `str`, found `()` error[E0527]: pattern requires 1 element but array has 2 --> $DIR/issue-105946.rs:6:9 | LL |     let [_y..] = [box 1, box 2]; |         ^^^^^^ expected 2 elements error: aborting due to 6 previous errors Some errors have detailed explanations: E0308, E0425, E0527, E0658. For more information about an error, try `rustc --explain E0308`. </ins>