@@ -24,12 +24,11 @@ use rustc_ast_pretty::pprust::expr_to_string;
2424use rustc_attr_parsing:: AttributeParser ;
2525use rustc_errors:: { Applicability , LintDiagnostic } ;
2626use rustc_feature:: GateIssue ;
27- use rustc_hir as hir;
2827use rustc_hir:: attrs:: { AttributeKind , DocAttribute } ;
2928use rustc_hir:: def:: { DefKind , Res } ;
3029use rustc_hir:: def_id:: { CRATE_DEF_ID , DefId , LocalDefId } ;
3130use rustc_hir:: intravisit:: FnKind as HirFnKind ;
32- use rustc_hir:: { Body , FnDecl , ImplItemImplKind , PatKind , PredicateOrigin , find_attr} ;
31+ use rustc_hir:: { self as hir , Body , FnDecl , ImplItemImplKind , PatKind , PredicateOrigin , find_attr} ;
3332use rustc_middle:: bug;
3433use rustc_middle:: lint:: LevelAndSource ;
3534use rustc_middle:: ty:: layout:: LayoutOf ;
@@ -59,7 +58,7 @@ use crate::lints::{
5958 BuiltinSpecialModuleNameUsed , BuiltinTrivialBounds , BuiltinTypeAliasBounds ,
6059 BuiltinUngatedAsyncFnTrackCaller , BuiltinUnpermittedTypeInit , BuiltinUnpermittedTypeInitSub ,
6160 BuiltinUnreachablePub , BuiltinUnsafe , BuiltinUnstableFeatures , BuiltinUnusedDocComment ,
62- BuiltinUnusedDocCommentSub , BuiltinWhileTrue , InvalidAsmLabel ,
61+ BuiltinUnusedDocCommentSub , BuiltinWhileTrue , EqInternalMethodImplemented , InvalidAsmLabel ,
6362} ;
6463use crate :: {
6564 EarlyContext , EarlyLintPass , LateContext , LateLintPass , Level , LintContext ,
@@ -3191,3 +3190,32 @@ impl EarlyLintPass for SpecialModuleName {
31913190 }
31923191 }
31933192}
3193+
3194+ declare_lint ! {
3195+ pub EQ_ASSERT_RECEIVER_IS_TOTAL_EQ_IMPL ,
3196+ Warn ,
3197+ "manual implementation of the internal `Eq::assert_receiver_is_total_eq` method" ,
3198+ @future_incompatible = FutureIncompatibleInfo {
3199+ reason: fcw!( FutureReleaseError #150000 ) ,
3200+ report_in_deps: false ,
3201+ } ;
3202+ }
3203+
3204+ declare_lint_pass ! ( EqAssertReceiverIsTotalEq => [ EQ_ASSERT_RECEIVER_IS_TOTAL_EQ_IMPL ] ) ;
3205+
3206+ impl < ' tcx > LateLintPass < ' tcx > for EqAssertReceiverIsTotalEq {
3207+ fn check_impl_item ( & mut self , cx : & LateContext < ' tcx > , item : & ' tcx rustc_hir:: ImplItem < ' tcx > ) {
3208+ if let ImplItemImplKind :: Trait { defaultness : _, trait_item_def_id : Ok ( trait_item_def_id) } =
3209+ item. impl_kind
3210+ && item. ident . name == sym:: assert_receiver_is_total_eq
3211+ && cx. tcx . is_diagnostic_item ( sym:: assert_receiver_is_total_eq, trait_item_def_id)
3212+ && !item. span . from_expansion ( )
3213+ {
3214+ cx. emit_span_lint (
3215+ EQ_ASSERT_RECEIVER_IS_TOTAL_EQ_IMPL ,
3216+ item. span ,
3217+ EqInternalMethodImplemented ,
3218+ ) ;
3219+ }
3220+ }
3221+ }
0 commit comments