For this test case:

# include <fstream>
# include <istream>

using namespace std;

ifstream  x;
ifstream& y = x;

int main(int argc, char** argv) {
  y = x;
  return 0;
}

current mainline g++ produces:

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 


Walking back from the point of error to the point of use can be helpful in some
scenarios.  However, for an example like this one it is unhelpful and serves to
disguise the real problem.

I think we can use the walkback more intelligently and say something like:

foo.cc:10: error: cannot synthesize method ‘std::basic_ifstream<char>&
std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)’
foo.cc:10: note: because ‘std::ios_base& std::ios_base::operator=(const
std::ios_base&)’ is private
foo.cc:10: note: for details use -fvery-long-error-messages


-- 
           Summary: C++ diagnostic for private operator= is voluminous and
                    unhelpful
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ian at airs dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39728

Reply via email to