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.