xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/readability/use-anyofallof.cpp (revision b4d9ac8b453e20e4223b5935c700698608a6425c)
1 // RUN: %check_clang_tidy -std=c++14,c++17 %s readability-use-anyofallof %t -- -- -fexceptions
2 // FIXME: Fix the checker to work in C++20 mode.
3 
good_any_of()4 bool good_any_of() {
5   int v[] = {1, 2, 3};
6   // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: replace loop by 'std::any_of()' [readability-use-anyofallof]
7   for (int i : v)
8     if (i)
9       return true;
10   return false;
11 }
12 
13 bool cond(int i);
14 
good_any_of2()15 bool good_any_of2() {
16   int v[] = {1, 2, 3};
17   for (int i : v) {
18     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: replace loop by 'std::any_of()'
19     int k = i / 2;
20     if (cond(k))
21       return true;
22   }
23   return false;
24 }
25 
good_any_of3()26 bool good_any_of3() {
27   int v[] = {1, 2, 3};
28   for (int i : v) {
29     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: replace loop by 'std::any_of()'
30     if (i == 3)
31       continue;
32     if (i)
33       return true;
34   }
35 
36   return false;
37 }
38 
good_any_of_use_external(int comp)39 bool good_any_of_use_external(int comp) {
40   int v[] = {1, 2, 3};
41   for (int i : v) {
42     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: replace loop by 'std::any_of()'
43     if (i == comp)
44       return true;
45   }
46 
47   return false;
48 }
49 
good_any_of_no_cond()50 bool good_any_of_no_cond() {
51   int v[] = {1, 2, 3};
52   for (int i : v) {
53     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: replace loop by 'std::any_of()'
54     return true; // Not a real loop, but technically can become any_of.
55   }
56 
57   return false;
58 }
59 
good_any_of_local_modification()60 bool good_any_of_local_modification() {
61   int v[] = {1, 2, 3};
62   for (int i : v) {
63     int j = i;
64     j++; // FIXME: Any non-const use disables check.
65     if (j > 3)
66       return true;
67   }
68 
69   return false;
70 }
71 
good_any_of_throw()72 bool good_any_of_throw() {
73   int v[] = {1, 2, 3};
74   for (int i : v) {
75     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: replace loop by 'std::any_of()'
76     if (i > 3)
77       return true;
78     if (i == 42)
79       throw 0;
80   }
81 
82   return false;
83 }
84 
bad_any_of1()85 bool bad_any_of1() {
86   int v[] = {1, 2, 3};
87   for (int i : v) {
88     if (i)
89       return false; // bad constant
90   }
91   return false;
92 }
93 
bad_any_of2()94 bool bad_any_of2() {
95   int v[] = {1, 2, 3};
96   for (int i : v)
97     if (i)
98       return true;
99 
100   return true; // bad return
101 }
102 
bad_any_of3()103 bool bad_any_of3() {
104   int v[] = {1, 2, 3};
105   for (int i : v)
106     if (i)
107       return true;
108     else
109       return i / 2; // bad return
110 
111   return false;
112 }
113 
bad_any_of_control_flow1()114 bool bad_any_of_control_flow1() {
115   int v[] = {1, 2, 3};
116   for (int i : v) {
117     break; // bad control flow
118     if (i)
119       return true;
120   }
121 
122   return false;
123 }
124 
bad_any_of_control_flow2()125 bool bad_any_of_control_flow2() {
126   int v[] = {1, 2, 3};
127   for (int i : v) {
128     goto end; // bad control flow
129     if (i)
130       return true;
131   }
132 
133   end:
134   return false;
135 }
136 
bad_any_of4()137 bool bad_any_of4() {
138   return false; // wrong order
139 
140   int v[] = {1, 2, 3};
141   for (int i : v) {
142     if (i)
143       return true;
144   }
145 }
146 
bad_any_of5()147 bool bad_any_of5() {
148   int v[] = {1, 2, 3};
149   int j = 0;
150   for (int i : v) {
151     j++; // modifications
152     if (i)
153       return true;
154   }
155   return false;
156 }
157 
bad_any_of6()158 bool bad_any_of6() {
159   int v[] = {1, 2, 3};
160   for (int i : v) {
161     if (i)
162       return true;
163   }
164   int j = 0; // Statements between loop and return
165   j++;
166   return false;
167 }
168 
bad_any_of7()169 bool bad_any_of7() {
170   int v[] = {1, 2, 3};
171   for (int i : v) {
172     i; // No 'return true' in body.
173   }
174   return false;
175 }
176 
good_all_of()177 bool good_all_of() {
178   int v[] = {1, 2, 3};
179   // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: replace loop by 'std::all_of()' [readability-use-anyofallof]
180   for (int i : v)
181     if (i)
182       return false;
183   return true;
184 }
185