239 lines · cpp
1// RUN: %check_clang_tidy %s performance-avoid-endl %t2 3namespace 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 std33 34void 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 54void 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 75void 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 96void 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 123void 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 162void 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 195using namespace std;196void 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 205namespace my_prefix = std;206void 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 215struct CustomLogger {216 template <typename T>217 std::ostream& operator<<(T);218 std::ostream& operator<<(std::ostream& (*)(std::ostream&));219};220 221void 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 229namespace gh107859 {230 231#define ENDL std::endl;232 233void bad_macro() {234 std::cout << ENDL;235 // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: do not use 'std::endl' with streams; use '\n' instead [performance-avoid-endl]236}237 238} // namespace gh107859239