http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39728
Manuel López-Ibáñez <manu at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2012-04-15 CC| |manu at gcc dot gnu.org, | |paolo.carlini at oracle dot | |com Ever Confirmed|0 |1 --- Comment #2 from Manuel López-Ibáñez <manu at gcc dot gnu.org> 2012-04-15 17:05:31 UTC --- This is what Clang prints: In file included from pr39728.C:1: In file included from /usr/include/c++/4.3/fstream:44: In file included from /usr/include/c++/4.3/istream:44: In file included from /usr/include/c++/4.3/ios:49: In file included from /usr/include/c++/4.3/bits/basic_ios.h:474: /usr/include/c++/4.3/bits/basic_ios.tcc:182:25: error: 'operator=' is a private member of 'std::ios_base' extern template class basic_ios<char>; ^ /usr/include/c++/4.3/bits/ios_base.h:785:5: note: declared private here operator=(const ios_base&); ^ /usr/include/c++/4.3/iosfwd:57:11: note: implicit default copy assignment operator for 'std::basic_ios<char>' first required here class basic_istream; ^ /usr/include/c++/4.3/bits/fstream.tcc:914:25: note: implicit default copy assignment operator for 'std::basic_istream<char>' first required here extern template class basic_ifstream<char>; ^ /usr/include/c++/4.3/bits/fstream.tcc:913:25: error: 'operator=' is a private member of 'std::basic_streambuf<char>' extern template class basic_filebuf<char>; ^ /usr/include/c++/4.3/streambuf:782:7: note: declared private here operator=(const __streambuf_type&) { return *this; }; ^ /usr/include/c++/4.3/bits/fstream.tcc:914:25: note: implicit default copy assignment operator for 'std::basic_filebuf<char>' first required here extern template class basic_ifstream<char>; ^ pr39728.C:10:5: note: implicit default copy assignment operator for 'std::basic_ifstream<char>' first required here y = x; ^ 2 errors generated. Even with canonicalized paths, GCC diagnostic is awful. Several things wrong: * Do not show "In member function", it clutters the output and it is duplicated info because they are already mentioned in the note. * What is a "synthesized method"? Where this term comes from? Is this something that an average C++ programmer can understand? * Avoid monsters like "std::basic_streambuf<_CharT, _Traits>::__streambuf_type& std::basic_streambuf<_CharT, _Traits>::operator=(const __streambuf_type&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]" Following Ian's suggestion, it would be amazing if GCC emitted: pr39728.C:10:5: error: cannot call implicit default copy assignment operator for 'std::basic_ifstream<char>' note: candidates are: /usr/include/c++/4.3/streambuf:782:7: note: candidate #1 is implicit default copy assignment operator for 'std::basic_filebuf<char>' [...............] note: cannot be called because [reason] /usr/include/c++/4.3/streambuf:782:7: note: candidate #1 is implicit default copy assignment operator for 'std::basic_filebuf<char>' [...............] note: cannot be called because [reason] /usr/include/c++/4.3/bits/fstream.tcc:914:25: note: candidate #2 is implicit default copy assignment operator for 'std::basic_istream<char>' [...............] note: cannot be called because [reason] I am sorry, I don't have time to fix all this, but I wish we had enough developers to fix it, because it is a shame.