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
> 
> 


Reply via email to