Auto merge of #73446 - ecstatic-morse:issue-73431, r=pnkfelix
Make novel structural match violations not a `bug` Fixes (on master) #73431. Ideally, `CustomEq` would emit a strict subset of the structural match errors that are found by `search_for_structural_match_violation`, since it allows more cases due to value-based reasoning. However, const qualification is more conservative than `search_for_structural_match_violation` around associated constants, since qualification does not try to substitute type parameters. In the long term, we should probably make const qualification work for generic associated constants, but I don't like extending its capabilities even further. r? @pnkfelix
This commit is contained in:
commit
036b5fec49
@ -107,8 +107,15 @@ fn to_pat(
|
|||||||
cv.ty, structural
|
cv.ty, structural
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// This can occur because const qualification treats all associated constants as
|
||||||
|
// opaque, whereas `search_for_structural_match_violation` tries to monomorphize them
|
||||||
|
// before it runs.
|
||||||
|
//
|
||||||
|
// FIXME(#73448): Find a way to bring const qualification into parity with
|
||||||
|
// `search_for_structural_match_violation`.
|
||||||
if structural.is_none() && mir_structural_match_violation {
|
if structural.is_none() && mir_structural_match_violation {
|
||||||
bug!("MIR const-checker found novel structural match violation");
|
warn!("MIR const-checker found novel structural match violation. See #73448.");
|
||||||
|
return inlined_const_as_pat;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(non_sm_ty) = structural {
|
if let Some(non_sm_ty) = structural {
|
||||||
|
29
src/test/ui/consts/const_in_pattern/issue-73431.rs
Normal file
29
src/test/ui/consts/const_in_pattern/issue-73431.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// run-pass
|
||||||
|
|
||||||
|
// Regression test for https://github.com/rust-lang/rust/issues/73431.
|
||||||
|
|
||||||
|
pub trait Zero {
|
||||||
|
const ZERO: Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Zero for usize {
|
||||||
|
const ZERO: Self = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Zero> Zero for Wrapper<T> {
|
||||||
|
const ZERO: Self = Wrapper(T::ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
pub struct Wrapper<T>(T);
|
||||||
|
|
||||||
|
fn is_zero(x: Wrapper<usize>) -> bool {
|
||||||
|
match x {
|
||||||
|
Zero::ZERO => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = is_zero(Wrapper(42));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user