[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