On Thu, Aug 13, 2020 at 02:06:21PM +0200, Tobias Burnus wrote:
> Build server is x86_64-gnu-linux, "i686-pc-linux-gnu-g++" is a native binary 
> of GCC 5.2.0
> [Don't ask why i686 and not x86_64 is used.]

Ah, ok, so this boils down to:
int i = alignof (long long int);
struct TTT { char a; long long int b; };
int j = alignof (TTT);
ending up to be 8, 4 with -O2 -m32 in GCC 4.8 - 7.x and
only in GCC 8+ 4, 4.

So perhaps we want:
--- gcc/vec.h.jj        2020-08-12 12:45:58.410686880 +0200
+++ gcc/vec.h   2020-08-13 14:18:06.967041880 +0200
@@ -1281,10 +1281,11 @@ template<typename T, typename A>
 inline size_t
 vec<T, A, vl_embed>::embedded_size (unsigned alloc)
 {
-  struct alignas (T) U { char data[sizeof (T)]; };
+  struct V { char a; T b; };
+  struct alignas (V) U { char data[sizeof (T)]; };
   typedef vec<U, A, vl_embed> vec_embedded;
-  static_assert (sizeof (vec_embedded) == sizeof(vec), "");
-  static_assert (alignof (vec_embedded) == alignof(vec), "");
+  static_assert (sizeof (vec_embedded) == sizeof (vec), "");
+  static_assert (alignof (vec_embedded) == alignof (vec), "");
   return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
 }

or
--- gcc/vec.h.jj        2020-08-12 12:45:58.410686880 +0200
+++ gcc/vec.h   2020-08-13 14:18:06.967041880 +0200
@@ -1281,10 +1281,11 @@ template<typename T, typename A>
 inline size_t
 vec<T, A, vl_embed>::embedded_size (unsigned alloc)
 {
-  struct alignas (T) U { char data[sizeof (T)]; };
+  struct V { char a; T b; } *v;
+  struct alignas (alignof (v->b)) U { char data[sizeof (T)]; };
   typedef vec<U, A, vl_embed> vec_embedded;
-  static_assert (sizeof (vec_embedded) == sizeof(vec), "");
-  static_assert (alignof (vec_embedded) == alignof(vec), "");
+  static_assert (sizeof (vec_embedded) == sizeof (vec), "");
+  static_assert (alignof (vec_embedded) == alignof (vec), "");
   return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
 }
 
?

        Jakub

Reply via email to