http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56084
Bug #: 56084 Summary: poor error recovery for missing ";" Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: m...@gcc.gnu.org #include <string> #include <iostream> struct Student { std::string surname; std::string givenname; } std::ostream& operator<<(std::ostream& out, Student const& s) { return out << "{" << s.surname << ", " << s.givenname << "}"; } int main() { Student me = { "Doe", "John" }; std::cout << me << "\n"; } clang not perfect but bearable: test.cc:9:8: error: redefinition of 'ostream' as different kind of symbol std::ostream& operator<<(std::ostream& out, Student const& s) { ^ /usr/lib/gcc/x86_64-linux-gnu/4.4/../../../../include/c++/4.4/iosfwd:129:33: note: previous definition is here typedef basic_ostream<char> ostream; ///< @isiosfwd ^ test.cc:9:15: error: expected ';' after top level declarator std::ostream& operator<<(std::ostream& out, Student const& s) { ^ ; 2 errors generated. G++ 4.8.0 awful: test.cc:9:15: error: expected initializer before ‘&’ token std::ostream& operator<<(std::ostream& out, Student const& s) { ^ test.cc: In function ‘int main()’: test.cc:15:13: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Student’) std::cout << me << "\n"; ^ test.cc:15:13: note: candidates are: In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:110:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(__ostream_type& (*__pf)(__ostream_type&)) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:110:7: note: no known conversion for argument 1 from ‘Student’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:119:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>; std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] operator<<(__ios_type& (*__pf)(__ios_type&)) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:119:7: note: no known conversion for argument 1 from ‘Student’ to ‘std::basic_ostream<char>::__ios_type& (*)(std::basic_ostream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:129:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(ios_base& (*__pf) (ios_base&)) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:129:7: note: no known conversion for argument 1 from ‘Student’ to ‘std::ios_base& (*)(std::ios_base&)’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:168:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(long __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:168:7: note: no known conversion for argument 1 from ‘Student’ to ‘long int’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:172:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(unsigned long __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:172:7: note: no known conversion for argument 1 from ‘Student’ to ‘long unsigned int’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:176:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(bool __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:176:7: note: no known conversion for argument 1 from ‘Student’ to ‘bool’ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:611:0, from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:93:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char; _Traits = std::char_traits<char>] basic_ostream<_CharT, _Traits>:: ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:93:5: note: no known conversion for argument 1 from ‘Student’ to ‘short int’ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:183:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(unsigned short __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:183:7: note: no known conversion for argument 1 from ‘Student’ to ‘short unsigned int’ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:611:0, from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:107:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char; _Traits = std::char_traits<char>] basic_ostream<_CharT, _Traits>:: ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:107:5: note: no known conversion for argument 1 from ‘Student’ to ‘int’ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:194:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(unsigned int __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:194:7: note: no known conversion for argument 1 from ‘Student’ to ‘unsigned int’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:203:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(long long __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:203:7: note: no known conversion for argument 1 from ‘Student’ to ‘long long int’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:207:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(unsigned long long __n) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:207:7: note: no known conversion for argument 1 from ‘Student’ to ‘long long unsigned int’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:222:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(double __f) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:222:7: note: no known conversion for argument 1 from ‘Student’ to ‘double’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:226:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(float __f) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:226:7: note: no known conversion for argument 1 from ‘Student’ to ‘float’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:234:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(long double __f) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:234:7: note: no known conversion for argument 1 from ‘Student’ to ‘long double’ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:247:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(const void* __p) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:247:7: note: no known conversion for argument 1 from ‘Student’ to ‘const void*’ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:611:0, from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:121:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>] basic_ostream<_CharT, _Traits>:: ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:121:5: note: no known conversion for argument 1 from ‘Student’ to ‘std::basic_ostream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}’ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:550:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*) operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:550:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘const unsigned char*’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:545:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*) operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:545:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘const signed char*’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:532:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*) operator<<(basic_ostream<char, _Traits>& __out, const char* __s) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:532:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘const char*’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:611:0, from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:323:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/ostream.tcc:323:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘const char*’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:515:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*) operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:515:5: note: template argument deduction/substitution failed: test.cc:15:16: note: mismatched types ‘const _CharT*’ and ‘Student’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:495:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char) operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:495:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘unsigned char’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:490:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char) operator<<(basic_ostream<char, _Traits>& __out, signed char __c) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:490:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘signed char’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:484:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char) operator<<(basic_ostream<char, _Traits>& __out, char __c) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:484:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘char’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:478:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) operator<<(basic_ostream<_CharT, _Traits>& __out, char __c) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:478:5: note: template argument deduction/substitution failed: test.cc:15:16: note: cannot convert ‘me’ (type ‘Student’) to type ‘char’ std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/iostream:40:0, from test.cc:2: /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:473:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c) ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/ostream:473:5: note: template argument deduction/substitution failed: test.cc:15:16: note: deduced conflicting types for parameter ‘_CharT’ (‘char’ and ‘Student’) std::cout << me << "\n"; ^ In file included from /home/manuel/test1/195333M/install/include/c++/4.8.0/string:54:0, from test.cc:1: /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/basic_string.h:2755:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&) operator<<(basic_ostream<_CharT, _Traits>& __os, ^ /home/manuel/test1/195333M/install/include/c++/4.8.0/bits/basic_string.h:2755:5: note: template argument deduction/substitution failed: test.cc:15:16: note: ‘Student’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’ std::cout << me << "\n"; ^