OK, looks like it wasn't being set because of a (silently changed?) behaviour I never anticipated when assigning to bitfields in C/C++. unsigned volatile_flag : 1; volatile_flag = (flags & 2); // Assigning bits are '10', however the // '1' is dropped because it doesn't fit. I'm sure that this used to work in an earlier version, however I'm even more surprised that this didn't trigger an overflow warning (it should have)!