On Fri, Feb 24, 2023 at 12:44:44PM +0100, Richard Biener wrote: > --- a/gcc/vec.h > +++ b/gcc/vec.h > @@ -586,8 +586,8 @@ public: > unsigned allocated (void) const { return m_vecpfx.m_alloc; } > unsigned length (void) const { return m_vecpfx.m_num; } > bool is_empty (void) const { return m_vecpfx.m_num == 0; } > - T *address (void) { return m_vecdata; } > - const T *address (void) const { return m_vecdata; } > + T *address (void) { return reinterpret_cast <T *> (this + 1); } > + const T *address (void) const { return reinterpret_cast <const T *> (this > + 1); }
This is now too long. > T *begin () { return address (); } > const T *begin () const { return address (); } > T *end () { return address () + length (); } > @@ -631,8 +631,7 @@ public: > > /* FIXME - These fields should be private, but we need to cater to > compilers that have stricter notions of PODness for types. */ > - vec_prefix m_vecpfx; > - T m_vecdata[1]; > + alignas (T) vec_prefix m_vecpfx; The comment needs adjustment and down't we need alignas (T) alignas (vec_prefix) ? > @@ -1588,7 +1587,7 @@ public: > > private: > vec<T, va_heap, vl_embed> m_auto; > - T m_data[MAX (N - 1, 1)]; > + alignas(T) unsigned char m_data[sizeof (T) * N]; > }; I still believe you don't need alignas(T) here (and space before (T) ). Also, I think it needs to be MAX (N, 2) instead of N, because auto_vec ctors use MAX (N, 2). We could also change all those to MAX (N, 1) now, but it can't be N because m_data[sizeof (T) * 0] is invalid in standard C. Anyway, I wonder if you get the -Werror=stringop-overflow= errors during bootstrap that I got with my version or not. Jakub