1 /* Test that operations on bit-fields yield results reduced to bit-field
2    type.  */
3 /* Origin: Joseph Myers <jsm@polyomino.org.uk> */
4 
5 extern void exit (int);
6 extern void abort (void);
7 
8 struct s {
9   unsigned long long u33: 33;
10   unsigned long long u40: 40;
11   unsigned long long u41: 41;
12 };
13 
14 struct s a = { 0x100000, 0x100000, 0x100000 };
15 struct s b = { 0x100000000ULL, 0x100000000ULL, 0x100000000ULL };
16 struct s c = { 0x1FFFFFFFFULL, 0, 0 };
17 
18 int
main(void)19 main (void)
20 {
21   if (a.u33 * a.u33 != 0 || a.u33 * a.u40 != 0 || a.u40 * a.u33 != 0
22       || a.u40 * a.u40 != 0)
23     abort ();
24   if (a.u33 * a.u41 != 0x10000000000ULL
25       || a.u40 * a.u41 != 0x10000000000ULL
26       || a.u41 * a.u33 != 0x10000000000ULL
27       || a.u41 * a.u40 != 0x10000000000ULL
28       || a.u41 * a.u41 != 0x10000000000ULL)
29     abort ();
30   if (b.u33 + b.u33 != 0)
31     abort ();
32   if (b.u33 + b.u40 != 0x200000000ULL
33       || b.u33 + b.u41 != 0x200000000ULL
34       || b.u40 + b.u33 != 0x200000000ULL
35       || b.u40 + b.u40 != 0x200000000ULL
36       || b.u40 + b.u41 != 0x200000000ULL
37       || b.u41 + b.u33 != 0x200000000ULL
38       || b.u41 + b.u40 != 0x200000000ULL
39       || b.u41 + b.u41 != 0x200000000ULL)
40     abort ();
41   if (a.u33 - b.u33 != 0x100100000ULL
42       || a.u33 - b.u40 != 0xFF00100000ULL
43       || a.u33 - b.u41 != 0x1FF00100000ULL
44       || a.u40 - b.u33 != 0xFF00100000ULL
45       || a.u40 - b.u40 != 0xFF00100000ULL
46       || a.u40 - b.u41 != 0x1FF00100000ULL
47       || a.u41 - b.u33 != 0x1FF00100000ULL
48       || a.u41 - b.u40 != 0x1FF00100000ULL
49       || a.u41 - b.u41 != 0x1FF00100000ULL)
50     abort ();
51   if (++c.u33 != 0 || --c.u40 != 0xFFFFFFFFFFULL || c.u41-- != 0)
52     abort ();
53   exit (0);
54 }
55