1
Fork 0

Make sure we keep emitting a hard error

This commit is contained in:
Oliver Scherer 2020-09-23 18:36:53 +02:00
parent 017423179a
commit da217644a1
3 changed files with 37 additions and 31 deletions

View file

@ -409,25 +409,43 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
// reference. This makes the rest of the matching logic simpler as it doesn't have // reference. This makes the rest of the matching logic simpler as it doesn't have
// to figure out how to get a reference again. // to figure out how to get a reference again.
ty::Adt(adt_def, _) if !self.type_marked_structural(pointee_ty) => { ty::Adt(adt_def, _) if !self.type_marked_structural(pointee_ty) => {
if self.include_lint_checks if self.behind_reference.get() {
&& !self.saw_const_match_error.get() if self.include_lint_checks
&& !self.saw_const_match_lint.get() && !self.saw_const_match_error.get()
{ && !self.saw_const_match_lint.get()
self.saw_const_match_lint.set(true); {
let path = self.tcx().def_path_str(adt_def.did); self.saw_const_match_lint.set(true);
let msg = format!( let path = self.tcx().def_path_str(adt_def.did);
"to use a constant of type `{}` in a pattern, \ let msg = format!(
`{}` must be annotated with `#[derive(PartialEq, Eq)]`", "to use a constant of type `{}` in a pattern, \
path, path, `{}` must be annotated with `#[derive(PartialEq, Eq)]`",
); path, path,
self.tcx().struct_span_lint_hir( );
lint::builtin::INDIRECT_STRUCTURAL_MATCH, self.tcx().struct_span_lint_hir(
self.id, lint::builtin::INDIRECT_STRUCTURAL_MATCH,
self.span, self.id,
|lint| lint.build(&msg).emit(), self.span,
); |lint| lint.build(&msg).emit(),
);
}
PatKind::Constant { value: cv }
} else {
if !self.saw_const_match_error.get() {
self.saw_const_match_error.set(true);
let path = self.tcx().def_path_str(adt_def.did);
let msg = format!(
"to use a constant of type `{}` in a pattern, \
`{}` must be annotated with `#[derive(PartialEq, Eq)]`",
path, path,
);
if self.include_lint_checks {
tcx.sess.span_err(span, &msg);
} else {
tcx.sess.delay_span_bug(span, &msg)
}
}
PatKind::Wild
} }
PatKind::Constant { value: cv }
} }
// All other references are converted into deref patterns and then recursively // All other references are converted into deref patterns and then recursively
// convert the dereferenced constant to a pattern that is the sub-pattern of the // convert the dereferenced constant to a pattern that is the sub-pattern of the

View file

@ -10,8 +10,6 @@ fn main() {
match C { match C {
C => {} C => {}
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
//~| WARN must be annotated
//~| WARN previously accepted
} }
const K: &T = &T; const K: &T = &T;
match K { match K {

View file

@ -1,18 +1,8 @@
warning: to use a constant of type `S` in a pattern, `S` must be annotated with `#[derive(PartialEq, Eq)]`
--> $DIR/match_ice.rs:11:9
|
LL | C => {}
| ^
|
= note: `#[warn(indirect_structural_match)]` on by default
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #62411 <https://github.com/rust-lang/rust/issues/62411>
error: to use a constant of type `S` in a pattern, `S` must be annotated with `#[derive(PartialEq, Eq)]` error: to use a constant of type `S` in a pattern, `S` must be annotated with `#[derive(PartialEq, Eq)]`
--> $DIR/match_ice.rs:11:9 --> $DIR/match_ice.rs:11:9
| |
LL | C => {} LL | C => {}
| ^ | ^
error: aborting due to previous error; 1 warning emitted error: aborting due to previous error