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:
commit
47a418420e
3 changed files with 65 additions and 11 deletions
34
src/test/ui/consts/issue-87046.rs
Normal file
34
src/test/ui/consts/issue-87046.rs
Normal 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
8
src/test/ui/consts/issue-87046.stderr
Normal file
8
src/test/ui/consts/issue-87046.stderr
Normal 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
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue