https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81273
--- Comment #3 from LdB <ldeboer at gateway dot net.au> --- I am stunned you could not build the code the only requirement is you include the stdint.h so the uint32_t types are defined. I will fix the typos are you really saying you can't compile this? #include <stdint.h> struct __attribute__((__packed__)) TimerRegisters { volatile uint32_t Load; //0x00 volatile uint32_t Value; //0x04 }; uint32_t base_addr = 0x3F000000; #define TIMER ((struct TimerRegisters*)(base_addr + 0xB400)) void ShowBug (void){ TIMER->Load = 0x400; // -02 compile and look at code } void ShowFix1 (void){ *(volatile uint32_t*)TIMER->Load = 0x400; } void ShowFix2 (void){ volatile uint32_t temp = 0x400; TIMER->Load = temp; } Alignment is not really a concern it's a hardware register to the CPU so it's a given.