In light of the foolhardy commitment I made, here are some reprehensible
diagnostic messages and the superb recanting of the obvious. As always, the
messaging and comments are gratuitously provided and I hope accepted in the
same manner.
Two notes (made before):
1: Some messages are needlessly garrulous. You have noted this previously.
2: The length of some diagnostic messages extend beyond reason. You have
noted this previously.
3: In a general environment with many classes, structures, typedef's, etc.
the clear association of a diagnostic message with the offending object,
type, etc. ads clarity. The messages included below have no clear
association (although we might argue that garrulity adds clarity).
4: Code is not self-documenting, sic COBOL, and diagnostic messages aren't
either. A document with messaging guidelines, message descriptions, or
anything else might be useful. Sigh, I can probably help with this.
As a suggestion, since all headers (and included symbols) are known prior to
compilation it might be possible to put all the 'names' into a symbol table for
use during error generation. This allows gcc to (perhaps) publish candidate
solutions when type errors are detected (see m3).
As (yet another) suggestion, since user headers can be processed independently
of code (without considering edge conditions) ya' might as well augment the
first suggestion with user symbols.
And yet again, while processing a given code file, symbols contained in the
code file can be used to (yet again) augment the symbol table for use in
diagnostic generation.
And NOW for the failures!
/*
* m1.cpp
*/
# 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"
/*
* m2.cpp
*/
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>"
/*
* m3.cpp
*/
# 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'.