Hmmm... I just read through the bug reports you cited. Sounds to me like this is still somewhat of an open issue, as to whether the compiler should issue an error in these cases or simply silently discard any templated function as a possible match for an operation involving an unnamed type. As was pointed out in the discussion, this is a *disastrous* change in the standard behavior of gcc because it essentially makes it impossible to safely use an unnamed enum type in an arithmetic operation. There is bound to be some template function overload declared in some header file somewhere that suddenly makes your code not work. I am shocked that there is no compiler flag made available to restore the previous behavior, especially in light of the fact that the disposition of this issue remains unresolved. I have checked several other C++ compilers now (Intel icc 8.1 and IBM xlC 7.0, for instance) and they all accept my example.
I also wish to point out that my example differs somewhat from the ones that were given in the previous bug reports you cited, in that mine involves arithmetic operations. My understanding is that enumerators (even from an unnamed enumeration) are to be treated as integers by default for arithmetic operations. This differs from the treatment for operators such as == and <<. (This is from the end of Section 4.8 of Stroustrup's book. Perhaps Stroustrup and the ANSI C++ standard differ here.) Regards, Julian C. > -----Original Message----- > From: Andrew Pinski [mailto:[EMAIL PROTECTED] > Sent: Friday, May 06, 2005 5:09 PM > To: Julian Cummings > Cc: gcc-bugs@gcc.gnu.org > Subject: Re: Problem with use of anonymous types > > > On May 6, 2005, at 8:09 PM, Julian Cummings wrote: > > > People are reporting trouble compiling blitz with > gcc-4.0.0, and the > > compiler errors are resulting from the use of unnamed > enums. A simple > > code illustrates the problem: > > > > struct nullType {}; > > template <typename T> inline T operator+(const T& a, nullType) { > > return a; } > > enum named { namedA = 1, namedB = 2 }; > > enum { unnamedA = 2, unnamedB = 4 }; > > struct bar { > > enum { namedC = namedA + namedB, > > unnamedC = unnamedA + unnamedB }; > > }; > > int main() { > > } > > > > The gcc compiler complains about trying to add unnamedA and > unnamedB. > > Apparently it gets confused by the presence of the > operator+ overload > > for the empty struct nullType. I don't see why the compiler would > > think that the anonymous enumerators unnamedA or unnamedB > would match > > with type nullType. Enumerators are supposed to default to > integers > > when used in arithmetic operations such as operator+. Everything > > compiles fine when the > > operator+ overload is not present. The code compiles as is under > > gcc-3.4. > > What gives? > > This is a bug in your code. See PR 19404 and PR 20589. > > -- Pinski > >