[Bug c++/56084] New: poor error recovery for missing ";"
manu at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jan 23 15:44:00 GMT 2013
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: unassigned@gcc.gnu.org
ReportedBy: manu@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";
^
More information about the Gcc-bugs
mailing list