11use std:: cmp:: Ordering ;
22
33use super :: UNNECESSARY_MIN_OR_MAX ;
4- use clippy_utils:: diagnostics:: span_lint_and_sugg;
5-
64use clippy_utils:: consts:: { ConstEvalCtxt , Constant , ConstantSource , FullInt } ;
5+ use clippy_utils:: diagnostics:: span_lint_and_sugg;
76use clippy_utils:: source:: snippet;
87
98use rustc_errors:: Applicability ;
109use rustc_hir:: Expr ;
1110use rustc_lint:: LateContext ;
1211use rustc_middle:: ty;
13- use rustc_span:: Span ;
12+ use rustc_span:: { sym , Span } ;
1413
1514pub ( super ) fn check < ' tcx > (
1615 cx : & LateContext < ' tcx > ,
@@ -21,26 +20,30 @@ pub(super) fn check<'tcx>(
2120) {
2221 let typeck_results = cx. typeck_results ( ) ;
2322 let ecx = ConstEvalCtxt :: with_env ( cx. tcx , cx. param_env , typeck_results) ;
24- if let Some ( ( left , ConstantSource :: Local | ConstantSource :: CoreConstant ) ) = ecx . eval_with_source ( recv )
25- && let Some ( ( right , ConstantSource :: Local | ConstantSource :: CoreConstant ) ) = ecx . eval_with_source ( arg )
23+ if let Some ( id ) = typeck_results . type_dependent_def_id ( expr . hir_id )
24+ && ( cx . tcx . is_diagnostic_item ( sym :: cmp_ord_min , id ) || cx . tcx . is_diagnostic_item ( sym :: cmp_ord_max , id ) )
2625 {
27- let Some ( ord) = Constant :: partial_cmp ( cx. tcx , typeck_results. expr_ty ( recv) , & left, & right) else {
28- return ;
29- } ;
26+ if let Some ( ( left, ConstantSource :: Local | ConstantSource :: CoreConstant ) ) = ecx. eval_with_source ( recv)
27+ && let Some ( ( right, ConstantSource :: Local | ConstantSource :: CoreConstant ) ) = ecx. eval_with_source ( arg)
28+ {
29+ let Some ( ord) = Constant :: partial_cmp ( cx. tcx , typeck_results. expr_ty ( recv) , & left, & right) else {
30+ return ;
31+ } ;
3032
31- lint ( cx, expr, name, recv. span , arg. span , ord) ;
32- } else if let Some ( extrema) = detect_extrema ( cx, recv) {
33- let ord = match extrema {
34- Extrema :: Minimum => Ordering :: Less ,
35- Extrema :: Maximum => Ordering :: Greater ,
36- } ;
37- lint ( cx, expr, name, recv. span , arg. span , ord) ;
38- } else if let Some ( extrema) = detect_extrema ( cx, arg) {
39- let ord = match extrema {
40- Extrema :: Minimum => Ordering :: Greater ,
41- Extrema :: Maximum => Ordering :: Less ,
42- } ;
43- lint ( cx, expr, name, recv. span , arg. span , ord) ;
33+ lint ( cx, expr, name, recv. span , arg. span , ord) ;
34+ } else if let Some ( extrema) = detect_extrema ( cx, recv) {
35+ let ord = match extrema {
36+ Extrema :: Minimum => Ordering :: Less ,
37+ Extrema :: Maximum => Ordering :: Greater ,
38+ } ;
39+ lint ( cx, expr, name, recv. span , arg. span , ord) ;
40+ } else if let Some ( extrema) = detect_extrema ( cx, arg) {
41+ let ord = match extrema {
42+ Extrema :: Minimum => Ordering :: Greater ,
43+ Extrema :: Maximum => Ordering :: Less ,
44+ } ;
45+ lint ( cx, expr, name, recv. span , arg. span , ord) ;
46+ }
4447 }
4548}
4649
0 commit comments