https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116885
--- Comment #7 from Jaroslav Fojtík <JaFojtik at seznam dot cz> --- Just for clarification. This worked till GCC-14 - The code has been verified and proven functionable many times: case 'e':{const uint64_t e = va_arg(ap,uint64_t); writed+=WrQWORD_LoEnd(e,F);} break; case 'E':{const uint64_t e = va_arg(ap,uint64_t); writed+=WrQWORD_HiEnd(e,F);} break; This is just correct (of course for architectures, where double has 8 bytes): case 'e':{const double e = va_arg(ap,double); writed+=WrQWORD_LoEnd(*(uint64_t*)&e,F);} break; case 'E':{const double e = va_arg(ap,double); writed+=WrQWORD_HiEnd(*(uint64_t*)&e,F);} break;