/* Test that operations on bit-fields yield results reduced to bit-field type. */ /* Origin: Joseph Myers */ extern void exit (int); extern void abort (void); struct s { unsigned long long u33: 33; unsigned long long u40: 40; unsigned long long u41: 41; }; struct s a = { 0x100000, 0x100000, 0x100000 }; struct s b = { 0x100000000ULL, 0x100000000ULL, 0x100000000ULL }; struct s c = { 0x1FFFFFFFFULL, 0, 0 }; int main (void) { if (a.u33 * a.u33 != 0 || a.u33 * a.u40 != 0 || a.u40 * a.u33 != 0 || a.u40 * a.u40 != 0) abort (); if (a.u33 * a.u41 != 0x10000000000ULL || a.u40 * a.u41 != 0x10000000000ULL || a.u41 * a.u33 != 0x10000000000ULL || a.u41 * a.u40 != 0x10000000000ULL || a.u41 * a.u41 != 0x10000000000ULL) abort (); if (b.u33 + b.u33 != 0) abort (); if (b.u33 + b.u40 != 0x200000000ULL || b.u33 + b.u41 != 0x200000000ULL || b.u40 + b.u33 != 0x200000000ULL || b.u40 + b.u40 != 0x200000000ULL || b.u40 + b.u41 != 0x200000000ULL || b.u41 + b.u33 != 0x200000000ULL || b.u41 + b.u40 != 0x200000000ULL || b.u41 + b.u41 != 0x200000000ULL) abort (); if (a.u33 - b.u33 != 0x100100000ULL || a.u33 - b.u40 != 0xFF00100000ULL || a.u33 - b.u41 != 0x1FF00100000ULL || a.u40 - b.u33 != 0xFF00100000ULL || a.u40 - b.u40 != 0xFF00100000ULL || a.u40 - b.u41 != 0x1FF00100000ULL || a.u41 - b.u33 != 0x1FF00100000ULL || a.u41 - b.u40 != 0x1FF00100000ULL || a.u41 - b.u41 != 0x1FF00100000ULL) abort (); if (++c.u33 != 0 || --c.u40 != 0xFFFFFFFFFFULL || c.u41-- != 0) abort (); exit (0); }