Rollup merge of #87065 - FabianWolff:issue-87046, r=oli-obk

Fix ICE with unsized type in const pattern

Fixes #87046. The `deref_const()` query currently contains the following check:
e9a387d6cf/compiler/rustc_mir/src/const_eval/mod.rs (L191-L204)

i.e. this will cause an ICE for every unsized type except slices. An error is reported with my changes if such a type is used as a const pattern (this should not be a breaking change, since so far, this has caused an ICE).
This commit is contained in:
Yuki Okushi 2021-07-13 08:54:34 +09:00 committed by GitHub
commit 47a418420e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 11 deletions

View file

@ -0,0 +1,34 @@
// Regression test for the ICE described in #87046.
#![crate_type="lib"]
#![allow(unreachable_patterns)]
#![feature(const_fn_union)]
#[derive(PartialEq, Eq)]
#[repr(transparent)]
pub struct Username(str);
pub const ROOT_USER: &Username = Username::from_str("root");
impl Username {
pub const fn from_str(raw: &str) -> &Self {
union Transmute<'a> {
raw: &'a str,
typed: &'a Username,
}
unsafe { Transmute { raw }.typed }
}
pub const fn as_str(&self) -> &str {
&self.0
}
pub fn is_root(&self) -> bool {
match self {
ROOT_USER => true,
//~^ ERROR: cannot use unsized non-slice type `Username` in constant patterns
_ => false,
}
}
}

View file

@ -0,0 +1,8 @@
error: cannot use unsized non-slice type `Username` in constant patterns
--> $DIR/issue-87046.rs:29:13
|
LL | ROOT_USER => true,
| ^^^^^^^^^
error: aborting due to previous error