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



--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> 2013-02-19 
14:17:16 UTC ---

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

Reply via email to