@@ -6,8 +6,11 @@ use clippy_utils::source::SpanRangeExt;
66use  clippy_utils:: { is_from_proc_macro,  path_to_local} ; 
77use  rustc_errors:: Applicability ; 
88use  rustc_hir:: { BinOpKind ,  Constness ,  Expr ,  ExprKind } ; 
9+ use  rustc_hir:: def:: DefKind ; 
10+ use  rustc_hir:: def_id:: DefId ; 
911use  rustc_lint:: { LateContext ,  LateLintPass ,  Lint ,  LintContext } ; 
1012use  rustc_middle:: lint:: in_external_macro; 
13+ use  rustc_middle:: ty:: TyCtxt ; 
1114use  rustc_session:: impl_lint_pass; 
1215
1316declare_clippy_lint !  { 
@@ -94,6 +97,44 @@ impl ManualFloatMethods {
9497    } 
9598} 
9699
100+ fn  is_not_const ( tcx :  TyCtxt < ' _ > ,  def_id :  DefId )  -> bool  { 
101+     match  tcx. def_kind ( def_id)  { 
102+         DefKind :: Mod 
103+         | DefKind :: Struct 
104+         | DefKind :: Union 
105+         | DefKind :: Enum 
106+         | DefKind :: Variant 
107+         | DefKind :: Trait 
108+         | DefKind :: TyAlias 
109+         | DefKind :: ForeignTy 
110+         | DefKind :: TraitAlias 
111+         | DefKind :: AssocTy 
112+         | DefKind :: Macro ( ..) 
113+         | DefKind :: Field 
114+         | DefKind :: LifetimeParam 
115+         | DefKind :: ExternCrate 
116+         | DefKind :: Use 
117+         | DefKind :: ForeignMod 
118+         | DefKind :: GlobalAsm 
119+         | DefKind :: Impl  {  .. } 
120+         | DefKind :: OpaqueTy 
121+         | DefKind :: SyntheticCoroutineBody 
122+         | DefKind :: TyParam  => true , 
123+ 
124+         DefKind :: AnonConst 
125+         | DefKind :: InlineConst 
126+         | DefKind :: Const 
127+         | DefKind :: ConstParam 
128+         | DefKind :: Static  {  .. } 
129+         | DefKind :: Ctor ( ..) 
130+         | DefKind :: AssocConst  => false , 
131+ 
132+         DefKind :: Fn 
133+         | DefKind :: AssocFn 
134+         | DefKind :: Closure  => tcx. constness ( def_id)  == Constness :: NotConst , 
135+     } 
136+ } 
137+ 
97138impl < ' tcx >  LateLintPass < ' tcx >  for  ManualFloatMethods  { 
98139    fn  check_expr ( & mut  self ,  cx :  & LateContext < ' tcx > ,  expr :  & ' tcx  Expr < ' tcx > )  { 
99140        if  let  ExprKind :: Binary ( kind,  lhs,  rhs)  = expr. kind 
@@ -105,7 +146,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualFloatMethods {
105146            && exprs. iter_mut ( ) . partition_in_place ( |i| path_to_local ( i) . is_some ( ) )  == 2 
106147            && !in_external_macro ( cx. sess ( ) ,  expr. span ) 
107148            && ( 
108-                 matches ! ( cx. tcx. constness ( cx. tcx. hir( ) . enclosing_body_owner( expr. hir_id) ) ,   Constness :: NotConst ) 
149+                 is_not_const ( cx. tcx ,   cx. tcx . hir ( ) . enclosing_body_owner ( expr. hir_id ) . into ( ) ) 
109150                    || self . msrv . meets ( msrvs:: CONST_FLOAT_CLASSIFY ) 
110151            ) 
111152            && let  [ first,  second,  const_1,  const_2]  = exprs
0 commit comments