http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56394
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |INVALID
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> 2013-02-19
14:26:14 UTC ---
(In reply to comment #4)
> (In reply to comment #2)
> > (In reply to comment #1)
> > > Also reproduces with optimization but with -fno-inline. The issue must be
> > > with the exact division:
> > >
> > > D.2616_5 = end.0_3 - beg.1_4;
> > > D.2617_6 = D.2616_5 /[ex] 12;
> > >
> > > the difference is 4088 but that does not divide by 12. Which means your
> > > computed end is not correct (the pointers cannot point to elements of
> > > an array of Xyz).
> >
> > That is, you probably want
> >
> > template<class T>
> > T* end() {
> > auto e = reinterpret_cast<uintptr_t>(static_cast<char*>(mem) +
> > len);
> > return reinterpret_cast<T*>(e - len % sizeof(T));
> > }
> >
> > instead.
>
> Is there anything wrong with my original code?
Yes, pointer subtraction returns an index into an array, but your pointers
do not point to array elements but elsewhere. e % sizeof(T) depends on
the alignment of e, not on the size of the array.
> -- Maxim