@@ -207,11 +207,10 @@ impl<'tcx> LateLintPass<'tcx> for MissingFieldsInDebug {
207207 if let ItemKind :: Impl ( Impl { of_trait : Some ( trait_ref) , self_ty, items, .. } ) = item. kind
208208 && let Res :: Def ( DefKind :: Trait , trait_def_id) = trait_ref. path . res
209209 && 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
215214 && cx. match_def_path ( trait_def_id, & [ sym:: core, sym:: fmt, sym:: Debug ] )
216215 // don't trigger if this impl was derived
217216 && !cx. tcx . has_attr ( item. owner_id , sym:: automatically_derived)
@@ -222,7 +221,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingFieldsInDebug {
222221 && let body = cx. tcx . hir ( ) . body ( * body_id)
223222 && let ExprKind :: Block ( block, _) = body. value . kind
224223 // 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 ( )
226225 && let Some ( self_adt) = self_ty. ty_adt_def ( )
227226 && let Some ( self_def_id) = self_adt. did ( ) . as_local ( )
228227 && let Some ( Node :: Item ( self_item) ) = cx. tcx . hir ( ) . find_by_def_id ( self_def_id)
0 commit comments