On Fri, Aug 29, 2025 at 10:08:38AM +0200, Tomasz Kaminski wrote:
> > +  if (sizeof(S) != sizeof(T))
> > +    return;
> >
> These seem insufficient to prevent compilation errors that bit_cast<T>(S{})
> would
> produce if their size is not much. My preference here would be to have some
> dr-require
> expressing that, but I am not sure if it is possible.

It can be done also just with
#if __SIZEOF_INT__ * 2 == _SIZEOF_LONG_LONG__
because I'm not aware of any target supported by GCC that would insert
any padding in these structures.

> As alternative, you could use:
> template<typename X, typename Y>
>   void test01() {} // empty
> template<typename X, typename Y>
>   requires (sizeof(X) == sizeof(Y))
>   void test01() {
>   }
> And call it test01<S, T>.
> 
> However, I think best option would be to change S, to store:
> struct S { alignas(long) char a[sizeof(long)]; }
> You are guaranteed to have at least 4 bytes there, so you can set them,
> instead of setting members.

I'd prefer both not using char because that has different behavior for TBAA.
Which is why I think 2xint vs. long long is better.

        Jakub

Reply via email to