1 | // RUN: %check_clang_tidy %s performance-avoid-endl %t |
2 | |
3 | namespace std { |
4 | template <typename CharT> |
5 | class basic_ostream { |
6 | public: |
7 | template <typename T> |
8 | basic_ostream& operator<<(T); |
9 | basic_ostream& operator<<(basic_ostream<CharT>& (*)(basic_ostream<CharT>&)); |
10 | }; |
11 | |
12 | template <typename CharT> |
13 | class basic_iostream : public basic_ostream<CharT> {}; |
14 | |
15 | using ostream = basic_ostream<char>; |
16 | using wostream = basic_ostream<wchar_t>; |
17 | |
18 | using iostream = basic_iostream<char>; |
19 | using wiostream = basic_iostream<wchar_t>; |
20 | |
21 | ostream cout; |
22 | wostream wcout; |
23 | |
24 | ostream cerr; |
25 | wostream wcerr; |
26 | |
27 | ostream clog; |
28 | wostream wclog; |
29 | |
30 | template<typename CharT> |
31 | basic_ostream<CharT>& endl(basic_ostream<CharT>&); |
32 | } // namespace std |
33 | |
34 | void good() { |
35 | std::cout << "Hello" << '\n'; |
36 | std::cout << "World\n" ; |
37 | |
38 | std::wcout << "Hello" << '\n'; |
39 | std::wcout << "World\n" ; |
40 | |
41 | std::cerr << "Hello" << '\n'; |
42 | std::cerr << "World\n" ; |
43 | |
44 | std::wcerr << "Hello" << '\n'; |
45 | std::wcerr << "World\n" ; |
46 | |
47 | std::clog << "Hello" << '\n'; |
48 | std::clog << "World\n" ; |
49 | |
50 | std::wclog << "Hello" << '\n'; |
51 | std::wclog << "World\n" ; |
52 | } |
53 | |
54 | void bad() { |
55 | std::cout << "World" << std::endl; |
56 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
57 | // CHECK-FIXES: std::cout << "World" << '\n'; |
58 | std::wcout << "World" << std::endl; |
59 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
60 | // CHECK-FIXES: std::wcout << "World" << '\n'; |
61 | std::cerr << "World" << std::endl; |
62 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
63 | // CHECK-FIXES: std::cerr << "World" << '\n'; |
64 | std::wcerr << "World" << std::endl; |
65 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
66 | // CHECK-FIXES: std::wcerr << "World" << '\n'; |
67 | std::clog << "World" << std::endl; |
68 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
69 | // CHECK-FIXES: std::clog << "World" << '\n'; |
70 | std::wclog << "World" << std::endl; |
71 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
72 | // CHECK-FIXES: std::wclog << "World" << '\n'; |
73 | } |
74 | |
75 | void bad_single_argument() { |
76 | std::cout << std::endl; |
77 | // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
78 | // CHECK-FIXES: std::cout << '\n'; |
79 | std::wcout << std::endl; |
80 | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
81 | // CHECK-FIXES: std::wcout << '\n'; |
82 | std::cerr << std::endl; |
83 | // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
84 | // CHECK-FIXES: std::cerr << '\n'; |
85 | std::wcerr << std::endl; |
86 | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
87 | // CHECK-FIXES: std::wcerr << '\n'; |
88 | std::clog << std::endl; |
89 | // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
90 | // CHECK-FIXES: std::clog << '\n'; |
91 | std::wclog << std::endl; |
92 | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
93 | // CHECK-FIXES: std::wclog << '\n'; |
94 | } |
95 | |
96 | void bad_multiple() { |
97 | std::cout << "Hello" << std::endl << "World" << std::endl; |
98 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
99 | // CHECK-MESSAGES: :[[@LINE-2]]:51: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
100 | // CHECK-FIXES: std::cout << "Hello" << '\n' << "World" << '\n'; |
101 | std::wcout << "Hello" << std::endl << "World" << std::endl; |
102 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
103 | // CHECK-MESSAGES: :[[@LINE-2]]:52: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
104 | // CHECK-FIXES: std::wcout << "Hello" << '\n' << "World" << '\n'; |
105 | std::cerr << "Hello" << std::endl << "World" << std::endl; |
106 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
107 | // CHECK-MESSAGES: :[[@LINE-2]]:51: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
108 | // CHECK-FIXES: std::cerr << "Hello" << '\n' << "World" << '\n'; |
109 | std::wcerr << "Hello" << std::endl << "World" << std::endl; |
110 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
111 | // CHECK-MESSAGES: :[[@LINE-2]]:52: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
112 | // CHECK-FIXES: std::wcerr << "Hello" << '\n' << "World" << '\n'; |
113 | std::clog << "Hello" << std::endl << "World" << std::endl; |
114 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
115 | // CHECK-MESSAGES: :[[@LINE-2]]:51: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
116 | // CHECK-FIXES: std::clog << "Hello" << '\n' << "World" << '\n'; |
117 | std::wclog << "Hello" << std::endl << "World" << std::endl; |
118 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
119 | // CHECK-MESSAGES: :[[@LINE-2]]:52: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
120 | // CHECK-FIXES: std::wclog << "Hello" << '\n' << "World" << '\n'; |
121 | } |
122 | |
123 | void bad_function_call() { |
124 | std::endl(std::cout); |
125 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
126 | // CHECK-FIXES: std::cout << '\n'; |
127 | std::endl(std::cout << "Hi" ); |
128 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
129 | // CHECK-FIXES: std::cout << "Hi" << '\n'; |
130 | std::endl(std::wcout); |
131 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
132 | // CHECK-FIXES: std::wcout << '\n'; |
133 | std::endl(std::wcout << "Hi" ); |
134 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
135 | // CHECK-FIXES: std::wcout << "Hi" << '\n'; |
136 | std::endl(std::cerr); |
137 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
138 | // CHECK-FIXES: std::cerr << '\n'; |
139 | std::endl(std::cerr << "Hi" ); |
140 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
141 | // CHECK-FIXES: std::cerr << "Hi" << '\n'; |
142 | std::endl(std::wcerr); |
143 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
144 | // CHECK-FIXES: std::wcerr << '\n'; |
145 | std::endl(std::wcerr << "Hi" ); |
146 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
147 | // CHECK-FIXES: std::wcerr << "Hi" << '\n'; |
148 | std::endl(std::clog); |
149 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
150 | // CHECK-FIXES: std::clog << '\n'; |
151 | std::endl(std::clog << "Hi" ); |
152 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
153 | // CHECK-FIXES: std::clog << "Hi" << '\n'; |
154 | std::endl(std::wclog); |
155 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
156 | // CHECK-FIXES: std::wclog << '\n'; |
157 | std::endl(std::wclog << "Hi" ); |
158 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
159 | // CHECK-FIXES: std::wclog << "Hi" << '\n'; |
160 | } |
161 | |
162 | void bad_user_stream() { |
163 | std::iostream my_iostream; |
164 | std::wiostream my_wiostream; |
165 | std::ostream my_ostream; |
166 | std::wostream my_wostream; |
167 | |
168 | my_iostream << "Hi" << std::endl; |
169 | // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
170 | // CHECK-FIXES: my_iostream << "Hi" << '\n'; |
171 | my_wiostream << "Hi" << std::endl; |
172 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
173 | // CHECK-FIXES: my_wiostream << "Hi" << '\n'; |
174 | my_ostream << "Hi" << std::endl; |
175 | // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
176 | // CHECK-FIXES: my_ostream << "Hi" << '\n'; |
177 | my_wostream << "Hi" << std::endl; |
178 | // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
179 | // CHECK-FIXES: my_wostream << "Hi" << '\n'; |
180 | |
181 | std::endl(my_iostream); |
182 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
183 | // CHECK-FIXES: my_iostream << '\n'; |
184 | std::endl(my_wiostream); |
185 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
186 | // CHECK-FIXES: my_wiostream << '\n'; |
187 | std::endl(my_ostream); |
188 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
189 | // CHECK-FIXES: my_ostream << '\n'; |
190 | std::endl(my_wostream); |
191 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
192 | // CHECK-FIXES: my_wostream << '\n'; |
193 | } |
194 | |
195 | using namespace std; |
196 | void bad_using_namespace_std() { |
197 | cout << "Hello" << endl; |
198 | // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not use 'endl' with streams; use '\n' instead [performance-avoid-endl] |
199 | // CHECK-FIXES: cout << "Hello" << '\n'; |
200 | endl(cout); |
201 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'endl' with streams; use '\n' instead [performance-avoid-endl] |
202 | // CHECK-FIXES: cout << '\n'; |
203 | } |
204 | |
205 | namespace my_prefix = std; |
206 | void bad_using_user_namespace() { |
207 | my_prefix::cout << "Hello" << my_prefix::endl; |
208 | // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: do not use 'my_prefix::endl' with streams; use '\n' instead [performance-avoid-endl] |
209 | // CHECK-FIXES: my_prefix::cout << "Hello" << '\n'; |
210 | my_prefix::endl(my_prefix::cout); |
211 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use 'my_prefix::endl' with streams; use '\n' instead [performance-avoid-endl] |
212 | // CHECK-FIXES: my_prefix::cout << '\n'; |
213 | } |
214 | |
215 | struct CustomLogger { |
216 | template <typename T> |
217 | std::ostream& operator<<(T); |
218 | std::ostream& operator<<(std::ostream& (*)(std::ostream&)); |
219 | }; |
220 | |
221 | void bad_custom_stream() { |
222 | CustomLogger logger; |
223 | |
224 | logger << std::endl; |
225 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl] |
226 | // CHECK-FIXES: logger << '\n'; |
227 | } |
228 | |