-   Notifications  You must be signed in to change notification settings 
- Fork 13.9k
Closed
Labels
A-patternsRelating to patterns and pattern matchingRelating to patterns and pattern matchingC-bugCategory: This is a bug.Category: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.ICE tracked in rust-lang/glacier.
Description
const F: &'static dyn PartialEq<u32> = &7u32; fn main() { let a: &dyn PartialEq<u32> = &7u32; match a { F => panic!(), _ => {} } }causes an ICE on the current nightly
error: internal compiler error: src/librustc_mir_build/hair/pattern/_match.rs:363: cannot deref ByRef { alloc: Allocation { bytes: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], relocations: Relocations( SortedMap { data: [ ( Size { raw: 0, }, ( (), a2, ), ), ( Size { raw: 8, }, ( (), a4, ), ), ], }, ), init_mask: InitMask { blocks: [ 65535, ], len: Size { raw: 16, }, }, size: Size { raw: 16, }, align: Align { pow2: 3, }, mutability: Not, extra: (), }, offset: Size { raw: 0, }, }, dyn std::cmp::PartialEq<u32> -> dyn std::cmp::PartialEq<u32> thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:907:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Afaik this is caused by ty_is_partial_eq being slightly too permissive
 
rust/src/librustc_mir_build/hair/pattern/const_to_pat.rs
Lines 143 to 157 in 997d953
| let ty_is_partial_eq: bool = { | |
| let partial_eq_trait_id = | |
| self.tcx().require_lang_item(EqTraitLangItem, Some(self.span)); | |
| let obligation: PredicateObligation<'_> = predicate_for_trait_def( | |
| self.tcx(), | |
| self.param_env, | |
| ObligationCause::misc(self.span, self.id), | |
| partial_eq_trait_id, | |
| 0, | |
| cv.ty, | |
| &[], | |
| ); | |
| // FIXME: should this call a `predicate_must_hold` variant instead? | |
| self.infcx.predicate_may_hold(&obligation) | |
| }; | 
See #71038 (comment) for more details.
Metadata
Metadata
Assignees
Labels
A-patternsRelating to patterns and pattern matchingRelating to patterns and pattern matchingC-bugCategory: This is a bug.Category: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.ICE tracked in rust-lang/glacier.