diff options
| author | Fridtjof Stoldt <xFrednet@gmail.com> | 2024-12-29 15:52:35 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-29 15:52:35 +0000 |
| commit | f5f1abd8fbc0174b5300d78034f13cebdfe7cfca (patch) | |
| tree | 84dab589237e2f8eec675a2a277617ca04ec5a08 /clippy_lints/src | |
| parent | c8ba3e1d7a92a591e01c13df79a868fff8876534 (diff) | |
| parent | d7cc6c45c8f67f012b5111559bf321444e7c8722 (diff) | |
| download | rust-f5f1abd8fbc0174b5300d78034f13cebdfe7cfca.tar.gz rust-f5f1abd8fbc0174b5300d78034f13cebdfe7cfca.zip | |
`borrow_interior_mutable_const` ICE into FN (#13877)
This PR just makes sure that we exit the function before getting an ICE and adds a regression test. Related to #12979. We would need to keep researching the issue, but as the ICEing code isn't that complicated, getting a hotfix into nightly is urgent. changelog:[`borrow_interior_mutable_const`] Fix ICE #12979
Diffstat (limited to 'clippy_lints/src')
| -rw-r--r-- | clippy_lints/src/non_copy_const.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/clippy_lints/src/non_copy_const.rs b/clippy_lints/src/non_copy_const.rs index ebd301d5156..8409d179b0f 100644 --- a/clippy_lints/src/non_copy_const.rs +++ b/clippy_lints/src/non_copy_const.rs @@ -189,6 +189,8 @@ impl<'tcx> NonCopyConst<'tcx> { } fn is_value_unfrozen_raw_inner(cx: &LateContext<'tcx>, val: ty::ValTree<'tcx>, ty: Ty<'tcx>) -> bool { + // No branch that we check (yet) should continue if val isn't a ValTree::Branch + let ty::ValTree::Branch(val) = val else { return false }; match *ty.kind() { // the fact that we have to dig into every structs to search enums // leads us to the point checking `UnsafeCell` directly is the only option. @@ -197,12 +199,13 @@ impl<'tcx> NonCopyConst<'tcx> { // contained value. ty::Adt(def, ..) if def.is_union() => false, ty::Array(ty, _) => val - .unwrap_branch() .iter() .any(|field| Self::is_value_unfrozen_raw_inner(cx, *field, ty)), ty::Adt(def, args) if def.is_enum() => { - let (&variant_index, fields) = val.unwrap_branch().split_first().unwrap(); - let variant_index = VariantIdx::from_u32(variant_index.unwrap_leaf().to_u32()); + let Some((&ty::ValTree::Leaf(variant_index), fields)) = val.split_first() else { + return false; + }; + let variant_index = VariantIdx::from_u32(variant_index.to_u32()); fields .iter() .copied() @@ -215,12 +218,10 @@ impl<'tcx> NonCopyConst<'tcx> { .any(|(field, ty)| Self::is_value_unfrozen_raw_inner(cx, field, ty)) }, ty::Adt(def, args) => val - .unwrap_branch() .iter() .zip(def.non_enum_variant().fields.iter().map(|field| field.ty(cx.tcx, args))) .any(|(field, ty)| Self::is_value_unfrozen_raw_inner(cx, *field, ty)), ty::Tuple(tys) => val - .unwrap_branch() .iter() .zip(tys) .any(|(field, ty)| Self::is_value_unfrozen_raw_inner(cx, *field, ty)), |
