On Tue, Mar 14, 2023 at 07:29:19AM +0000, Richard Biener via Gcc-patches wrote:
> This is a reduced testcase for an issue I ran into when trying to
> improve PTA compile-time further, there wasn't any C family runfail
> in the testsuite for this.
> 
> Pushed.
> 
>       * g++.dg/torture/20230313.C: New testcase.

I've noticed this testcase FAILs on i686-linux with
-fstack-protector-strong.

sizeof (auto_vec<int, 8>) == 16, which in this case contains
4-byte m_vec (which points to to m_auto), then 8-byte m_auto
which contains just 8-byte m_vecpfx and finally 1 byte m_data,
rest is padding.  We then try to push 2 ints to it, so 8 bytes,
starting at the end of m_vecpfx aka address of m_data, but there
is just 1 byte + 3 bytes of padding.
In the lp64 case, I think sizeof (auto_vec<int, 8>) == 24,
because there is 8-byte m_vec, 8-byte m_vecpfx and 1-byte m_char
all with 8-byte alignment.

Can we just change
--- gcc/testsuite/g++.dg/torture/20230313.C.jj  2023-03-14 12:24:55.930723588 
+0100
+++ gcc/testsuite/g++.dg/torture/20230313.C     2023-03-20 11:11:55.009044518 
+0100
@@ -60,7 +60,7 @@ struct auto_vec : vec<T, va_heap>
     this->release ();
   }
   vec<T, va_heap, int> m_auto;
-  char m_data;
+  char m_data[2 * sizeof (int)];
 };
 template<typename T>
 struct vec<T, va_heap>

or does it go against what the testcase wants to verify?
Or
  char m_data[__alignof (void *) == 2 * sizeof (int) ? 1 : 2 * sizeof (int)];
to make it work almost as is (just char[1] instead of char) for LP64 and
use the exact size otherwise (ILP32, 128-bit pointers and the like)?

        Jakub

Reply via email to