http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56394



--- Comment #6 from Maxim Yegorushkin <maxim.yegorushkin at gmail dot com> 
2013-02-19 14:31:10 UTC ---

(In reply to comment #5)

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



You are right Richard, it should not take into consideration the base address

of

the mapping in end<>.



Thanks a lot.

Reply via email to