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

Reply via email to