This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Possible messaging changes
- From: Ian Lance Taylor <iant at google dot com>
- To: Arthur Schwarz <aschwarz1309 at verizon dot net>
- Cc: gcc at gcc dot gnu dot org
- Date: Fri, 10 Apr 2009 13:24:00 -0700
- Subject: Re: Possible messaging changes
- References: <164665.31638.qm@web84004.mail.mud.yahoo.com>
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