1 // CHECK-FIXES: #include <utility>
2 // RUN: %check_clang_tidy -std=c++20 %s modernize-use-integer-sign-comparison %t
3 
4 // The code that triggers the check
5 #define MAX_MACRO(a, b) (a < b) ? b : a
6 
7 unsigned int FuncParameters(int bla) {
8     unsigned int result = 0;
9     if (result == bla)
10         return 0;
11 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
12 // CHECK-FIXES: if (std::cmp_equal(result , bla))
13 
14     return 1;
15 }
16 
17 template <typename T>
18 void TemplateFuncParameter(T val) {
19     unsigned long uL = 0;
20     if (val >= uL)
21         return;
22 // CHECK-MESSAGES-NOT: warning:
23 }
24 
25 template <typename T1, typename T2>
26 int TemplateFuncParameters(T1 val1, T2 val2) {
27     if (val1 >= val2)
28         return 0;
29 // CHECK-MESSAGES-NOT: warning:
30     return 1;
31 }
32 
33 int AllComparisons() {
34     unsigned int uVar = 42;
35     unsigned short uArray[7] = {0, 1, 2, 3, 9, 7, 9};
36 
37     int sVar = -42;
38     short sArray[7] = {-1, -2, -8, -94, -5, -4, -6};
39 
40     enum INT_TEST {
41       VAL1 = 0,
42       VAL2 = -1
43     };
44 
45     char ch = 'a';
46     unsigned char uCh = 'a';
47     signed char sCh = 'a';
48     bool bln = false;
49 
50     if (bln == sVar)
51       return 0;
52 // CHECK-MESSAGES-NOT: warning:
53 
54     if (ch > uCh)
55       return 0;
56 // CHECK-MESSAGES-NOT: warning:
57 
58     if (sVar <= INT_TEST::VAL2)
59       return 0;
60 // CHECK-MESSAGES-NOT: warning:
61 
62     if (uCh < sCh)
63       return -1;
64 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
65 // CHECK-FIXES: if (std::cmp_less(uCh , sCh))
66 
67     if ((int)uVar < sVar)
68         return 0;
69 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
70 // CHECK-FIXES: if (std::cmp_less(uVar, sVar))
71 
72     (uVar != sVar) ? uVar = sVar
73                    : sVar = uVar;
74 // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
75 // CHECK-FIXES: (std::cmp_not_equal(uVar , sVar)) ? uVar = sVar
76 
77     while (uArray[0] <= sArray[0])
78         return 0;
79 // CHECK-MESSAGES: :[[@LINE-2]]:12: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
80 // CHECK-FIXES: while (std::cmp_less_equal(uArray[0] , sArray[0]))
81 
82     if (uArray[1] > sArray[1])
83         return 0;
84 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
85 // CHECK-FIXES: if (std::cmp_greater(uArray[1] , sArray[1]))
86 
87     MAX_MACRO(uVar, sArray[0]);
88 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
89 
90     if (static_cast<unsigned int>(uArray[2]) < static_cast<int>(sArray[2]))
91         return 0;
92 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
93 // CHECK-FIXES: if (std::cmp_less(uArray[2],sArray[2]))
94 
95     if ((unsigned int)uArray[3] < (int)sArray[3])
96         return 0;
97 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
98 // CHECK-FIXES: if (std::cmp_less(uArray[3],sArray[3]))
99 
100     if ((unsigned int)(uArray[4]) < (int)(sArray[4]))
101         return 0;
102 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
103 // CHECK-FIXES: if (std::cmp_less((uArray[4]),(sArray[4])))
104 
105     if (uArray[5] > sArray[5])
106         return 0;
107 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
108 // CHECK-FIXES: if (std::cmp_greater(uArray[5] , sArray[5]))
109 
110     #define VALUE sArray[6]
111     if (uArray[6] > VALUE)
112         return 0;
113 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
114 // CHECK-FIXES: if (std::cmp_greater(uArray[6] , VALUE))
115 
116 
117     FuncParameters(uVar);
118     TemplateFuncParameter(sVar);
119     TemplateFuncParameters(uVar, sVar);
120 
121     return 0;
122 }
123