https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118141
--- Comment #12 from Richard Yao <richard.yao at alumni dot stonybrook.edu> --- (In reply to Andrew Pinski from comment #11) > (In reply to Richard Yao from comment #10) > > I had thought the strict aliasing rule only applied within function scope, > > although that appears to be a misunderstanding upon checking this: > > > > https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8 > > > > This code compiles correctly: > > > > https://godbolt.org/z/3Tdnac8TE > > > > For my own education, is this a strict aliasing rule violation too or am I > > okay because I used a union type before the void pointer? > > Techincally the above is undefined behavior because one field of an union is > active at a time and you can only access via that one but GCC has an > documented extension about this being well defined. > > See > https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Optimize-Options.html#index- > fstrict-aliasing > > The practice of reading from a different union member than the one most > recently written to (called “type-punning”) is common. Even with > -fstrict-aliasing, type-punning is allowed, provided the memory is accessed > through the union type. So, the code above works as expected. Would I be correct to think you were were responding as if this were C++ code, rather than responding as if this were C code? I ask because I cannot use std::bit_cast in C and I thought type punning via unions was allowed by the C standard, while the C++ standard disallowed it.