Fix ICE when indirect_structural_match is allowed

This commit is contained in:
Fabian Wolff 2021-09-20 21:06:09 +02:00
parent 3bb9eecf07
commit 402ebc72b3
2 changed files with 30 additions and 6 deletions

View File

@ -322,16 +322,18 @@ fn recur(
&& !self.saw_const_match_lint.get()
{
self.saw_const_match_lint.set(true);
let msg = format!(
"to use a constant of type `{}` in a pattern, \
`{}` must be annotated with `#[derive(PartialEq, Eq)]`",
cv.ty, cv.ty,
);
tcx.struct_span_lint_hir(
lint::builtin::INDIRECT_STRUCTURAL_MATCH,
id,
span,
|lint| lint.build(&msg).emit(),
|lint| {
let msg = format!(
"to use a constant of type `{}` in a pattern, \
`{}` must be annotated with `#[derive(PartialEq, Eq)]`",
cv.ty, cv.ty,
);
lint.build(&msg).emit()
},
);
}
// Since we are behind a reference, we can just bubble the error up so we get a

View File

@ -0,0 +1,22 @@
// Regression test for the ICE described in #89088.
// check-pass
#![allow(indirect_structural_match)]
use std::borrow::Cow;
const FOO: &A = &A::Field(Cow::Borrowed("foo"));
#[derive(PartialEq, Eq)]
enum A {
Field(Cow<'static, str>)
}
fn main() {
let var = A::Field(Cow::Borrowed("bar"));
match &var {
FOO => todo!(),
_ => todo!()
}
}