@@ -207,11 +207,10 @@ impl<'tcx> LateLintPass<'tcx> for MissingFieldsInDebug {
207
207
if let ItemKind :: Impl ( Impl { of_trait : Some ( trait_ref) , self_ty, items, .. } ) = item. kind
208
208
&& let Res :: Def ( DefKind :: Trait , trait_def_id) = trait_ref. path . res
209
209
&& let TyKind :: Path ( QPath :: Resolved ( _, self_path) ) = & self_ty. kind
210
- // don't trigger if self is a generic parameter, e.g. `impl<T> Debug for T`
211
- // this can only happen in core itself, where the trait is defined,
212
- // but it caused ICEs in the past:
213
- // https://github.com/rust-lang/rust-clippy/issues/10887
214
- && !matches ! ( self_path. res, Res :: Def ( DefKind :: TyParam , _) )
210
+ // make sure that the self type is either a struct, an enum or a union
211
+ // this prevents ICEs such as when self is a type parameter or a primitive type
212
+ // (see #10887, #11063)
213
+ && let Res :: Def ( DefKind :: Struct | DefKind :: Enum | DefKind :: Union , self_path_did) = self_path. res
215
214
&& cx. match_def_path ( trait_def_id, & [ sym:: core, sym:: fmt, sym:: Debug ] )
216
215
// don't trigger if this impl was derived
217
216
&& !cx. tcx . has_attr ( item. owner_id , sym:: automatically_derived)
@@ -222,7 +221,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingFieldsInDebug {
222
221
&& let body = cx. tcx . hir ( ) . body ( * body_id)
223
222
&& let ExprKind :: Block ( block, _) = body. value . kind
224
223
// inspect `self`
225
- && let self_ty = cx. tcx . type_of ( self_path . res . def_id ( ) ) . skip_binder ( ) . peel_refs ( )
224
+ && let self_ty = cx. tcx . type_of ( self_path_did ) . skip_binder ( ) . peel_refs ( )
226
225
&& let Some ( self_adt) = self_ty. ty_adt_def ( )
227
226
&& let Some ( self_def_id) = self_adt. did ( ) . as_local ( )
228
227
&& let Some ( Node :: Item ( self_item) ) = cx. tcx . hir ( ) . find_by_def_id ( self_def_id)
0 commit comments