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