This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Possible messaging changes


Arthur Schwarz <aschwarz1309@verizon.net> writes:

> # include <fstream>
> # include <istream>
>
> using namespace std;
>
> ifstream  x;
> ifstream& y = x;
>
> int main(int argc, char** argv) {
>   y = x;
>   return 0;
> }
>
> g++.3.4.4 output
> m1.cpp: In member function `std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, s
> td::char_traits<char> >&)':
> /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ios_base.h:784: error: `std::ios_base& std::ios_base::operator=(const std::ios_base&)' is private
> m1.cpp:10: error: within this context
> m1.cpp: In member function `std::basic_filebuf<char, std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char> >::operator=(const std::basic_fil
> ebuf<char, std::char_traits<char> >&)':
> /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/streambuf:776: error: `std::basic_streambuf<_CharT, _Traits>& std::basic_streambuf<_CharT, _Traits>::operator=(con
> st std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private
> m1.cpp:10: error: within this context
>
> Almost indecipherable. The error is that operator=() is private.
> "error: assignment illegal, operator '=' private in ifstream"


gcc 3.4.4 is a bit old.  I tried current mainline, and I got this:

In file included from /home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/ios:39,
                 from /home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/istream:40,
                 from /home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/fstream:40,
                 from foo.cc:1:
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/ios_base.h: In member function âstd::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)â:
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/bits/ios_base.h:793: error: âstd::ios_base& std::ios_base::operator=(const std::ios_base&)â is private
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd:47: error: within this context
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd: In member function âstd::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)â:
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd:53: note: synthesized method âstd::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)â first required here 
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd: In member function âstd::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)â:
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd:81: note: synthesized method âstd::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)â first required here 
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/streambuf: In member function âstd::basic_filebuf<char>& std::basic_filebuf<char>::operator=(const std::basic_filebuf<char>&)â:
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/streambuf:778: error: âstd::basic_streambuf<_CharT, _Traits>::__streambuf_type& std::basic_streambuf<_CharT, _Traits>::operator=(const std::basic_streambuf<_CharT, _Traits>::__streambuf_type&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]â is private
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd:78: error: within this context
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd: In member function âstd::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)â:
/home/iant/gcc/install/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/iosfwd:81: note: synthesized method âstd::basic_filebuf<char>& std::basic_filebuf<char>::operator=(const std::basic_filebuf<char>&)â first required here 
foo.cc: In function âint main(int, char**)â:
foo.cc:10: note: synthesized method âstd::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)â first required here 


So the compiler is trying to show you how it got to the point where it
needed the private function.  I have to agree that it does rather
obscure the issue, though.  At least "std::char_traits<char>" is gone.

Filed as http://gcc.gnu.org/PR39728 .



> using namespace std;
>
> ifstream  x;
> ifstream  y();
>
> int main(int argc, char** argv) {
>   return 0;
> }
>
> g++.3.4.4 output
> m2.cpp:4: error: `ifstream' does not name a type
> m2.cpp:5: error: `ifstream' does not name a type
>
> Succint and clear message, however it might be clearer 
> to say that "'ifstream' not found" since the message
> says that 'ifstream' may be something other than a
> type.
>
> "error: ifstream not found"
> "note:  candidates are in #include <fstream>"

Mainline gcc has the same message.  I agree that "not found" seems
clearer.  I'm not sure I agree about suggesting header files; that is
the kind of thing which will work well in some environments but fail
badly in others.

Suggesting "not defined" in http://gcc.gnu.org/PR 39729 .



> # include <istream>
> # include <istream>
>
> using namespace std;
>
> ifstream  x;
> ifstream  y();
>
> int main(int argc, char** argv) {
>   return 0;
> }
>
> g++3.4.4 messaging
> m3.cpp:6: error: aggregate `std::ifstream x' has incomplete type and cannot be defined
> m3.cpp:6: error: storage size of `x' isn't known
>
> Messaging not clear. The naive issue is the 'ifstream' not found. 'std::ifstream' not
> found. 'std::ifstream x' is confusing. 
>
> If 'std::ifstream' not found, why is 'std::ifstream y();' legal?
>
> "error: ifstream incomplete in 'istream'.

Mainline says

foo.cc:6: error: aggregate âstd::ifstream xâ has incomplete type and cannot be defined

So at least we've lost the useless message about 'x'.  But, yes, this
message should also be simplified.

Filed as http://gcc.gnu.org/PR39730 .

Thanks.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]