This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: [C++0x] code that used to be accepted isn't accepted anymore (related to constexpr changes?)
- From: Zdeněk Sojka <zsojka at seznam dot cz>
- To: gcc-help at gcc dot gnu dot org
- Date: Tue, 09 Nov 2010 15:22:46 +0100 (CET)
- Subject: Re: [C++0x] code that used to be accepted isn't accepted anymore (related to constexpr changes?)
The patch has been posted at http://gcc.gnu.org/ml/gcc-patches/2010-11/msg00489.html and commited,
thanks Jason for fixing this!
(if this is a doublepost, sorry for that)
Zdenek
# > ----------------------------------------
# > On 11/07/2010 05:29 AM, Benoit Jacob wrote:
# > > This code:
# > >
# > >>>>> static const unsigned x = (unsigned)-1;
# > >>>>>
# > >>>>> enum e {
# > >>>>> ey = (int)x
# > >>>>> };
# > >
# > > relies on the constant global variable x being a true compile-time
# > > constant, right?
# > > But as far as I can see, it is impossible to guarantee that it
# > > actually is, since in theory you could do
# > >
# > > const_cast<int*>(&x) = 0;
# >
# > The standard says,
# >
# > Except that any class member declared mutable (7.1.1) can be modified,
# > any attempt to modify a const object during its lifetime (3.8) results
# > in undefined behavior.
# >
# > So the above assignment has undefined behavior, which means the compiler
# > is allowed to assume that it doesn't happen.
# >
# > > I guess that the only way is to say that the compiler remembers the
# > > initializer value -1 for x and uses it instead of x itself. In other
# > > words x itself is never used.
# >
# > Right.
# >
# > > I guess that this is where the "static"
# > > matters here since inside of one translation unit the initializer
# > > value -1 can be remembered?
# >
# > 'static' doesn't matter, just that it's const, integral, and initialized
# > with a constant expression.
# >
# > Jason
# >
# >
# >
#