fix [type error] for error E0029 and E0277
check explicitly for the type references error if ty.references_error() is true change the error to be err.delay_as_bug() and prevent the error E0029 and E0277 from emitting out this fix #105946
This commit is contained in:
parent
df756439df
commit
10dbcf0630
@ -553,6 +553,9 @@ fn emit_err_pat_range(
|
|||||||
(lhs, Some((true, rhs_ty, rhs_sp))) => one_side_err(rhs_sp, rhs_ty, lhs),
|
(lhs, Some((true, rhs_ty, rhs_sp))) => one_side_err(rhs_sp, rhs_ty, lhs),
|
||||||
_ => span_bug!(span, "Impossible, verified above."),
|
_ => span_bug!(span, "Impossible, verified above."),
|
||||||
}
|
}
|
||||||
|
if (lhs, rhs).references_error() {
|
||||||
|
err.downgrade_to_delayed_bug();
|
||||||
|
}
|
||||||
if self.tcx.sess.teach(&err.get_code().unwrap()) {
|
if self.tcx.sess.teach(&err.get_code().unwrap()) {
|
||||||
err.note(
|
err.note(
|
||||||
"In a match expression, only numbers and characters can be matched \
|
"In a match expression, only numbers and characters can be matched \
|
||||||
|
@ -1387,7 +1387,6 @@ fn report_selection_error(
|
|||||||
|
|
||||||
self.note_obligation_cause(&mut err, &obligation);
|
self.note_obligation_cause(&mut err, &obligation);
|
||||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||||
|
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ fn suggest_impl_trait(
|
|||||||
|
|
||||||
fn point_at_returns_when_relevant(
|
fn point_at_returns_when_relevant(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diagnostic,
|
err: &mut DiagnosticBuilder<'tcx, ErrorGuaranteed>,
|
||||||
obligation: &PredicateObligation<'tcx>,
|
obligation: &PredicateObligation<'tcx>,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1686,7 +1686,7 @@ fn suggest_impl_trait(
|
|||||||
|
|
||||||
fn point_at_returns_when_relevant(
|
fn point_at_returns_when_relevant(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diagnostic,
|
err: &mut DiagnosticBuilder<'tcx, ErrorGuaranteed>,
|
||||||
obligation: &PredicateObligation<'tcx>,
|
obligation: &PredicateObligation<'tcx>,
|
||||||
) {
|
) {
|
||||||
match obligation.cause.code().peel_derives() {
|
match obligation.cause.code().peel_derives() {
|
||||||
@ -1708,7 +1708,15 @@ fn point_at_returns_when_relevant(
|
|||||||
for expr in &visitor.returns {
|
for expr in &visitor.returns {
|
||||||
if let Some(returned_ty) = typeck_results.node_type_opt(expr.hir_id) {
|
if let Some(returned_ty) = typeck_results.node_type_opt(expr.hir_id) {
|
||||||
let ty = self.resolve_vars_if_possible(returned_ty);
|
let ty = self.resolve_vars_if_possible(returned_ty);
|
||||||
err.span_label(expr.span, &format!("this returned value is of type `{}`", ty));
|
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),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
src/test/ui/typeck/issue-105946.rs
Normal file
12
src/test/ui/typeck/issue-105946.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
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]
|
||||||
|
}
|
49
src/test/ui/typeck/issue-105946.stderr
Normal file
49
src/test/ui/typeck/issue-105946.stderr
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
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`.
|
Loading…
Reference in New Issue
Block a user