On Wed, Jul 30, 2025 at 04:56:06PM +0800, Yang Yujie wrote: > I'm not sure if this is correct, but isn't accessing __x in its own type > after do_copy already an undefined behavior? > > N3301 J.2 (34) > > An object has its stored value accessed other than by an lvalue of > > an allowable type (6.5.1). > > where "allowable type" refers to some variant of a compatible type, > and "_BitInt(PROMOTED_SIZE (x) * __CHAR_BIT__)" is not an allowable > type to access the object of (x).
It is copied using memcpy, so accessed using char type. That can copy also padding/trap etc. bits, but if the ABI say certain padding bits have some guaranteed state, at least by extension it should be ok to verify that. In your patch, it wasn't really testing anything about the padding bits unless it relies on the compiler not doing or doing some optimization (if it works at all). By doing the shift, it really tests the content of those padding bits (and by do_copy being noipa that serves as an optimization barrier, so it will always test those bits, can't assume they are right or what exactly __x will contain). Jakub