123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /* PR c/69389 */
- struct S { unsigned int a : 10; unsigned int b : 4; unsigned int c : 18; } s = { 210, 11, 1235 };
- unsigned int
- f1 (void)
- {
- unsigned int v;
- #pragma omp atomic read
- v = s.b;
- return v;
- }
- void
- f2 (unsigned int v)
- {
- #pragma omp atomic write
- s.b = v;
- }
- void
- f3 (void)
- {
- #pragma omp atomic
- s.b |= 1;
- }
- int
- f4 (void)
- {
- int v;
- #pragma omp atomic capture
- v = s.b += 8;
- return v;
- }
- int
- f5 (void)
- {
- int v;
- #pragma omp atomic capture
- {
- v = s.b;
- s.b -= 4;
- }
- return v;
- }
- void
- f6 (void)
- {
- #pragma omp atomic
- s.b = s.b & 7;
- }
- void
- f7 (void)
- {
- #pragma omp atomic
- s.b = ~7 & s.b;
- }
- int
- f8 (void)
- {
- int v;
- #pragma omp atomic capture
- v = s.b = 8 + s.b;
- return v;
- }
- int
- f9 (void)
- {
- int v;
- #pragma omp atomic capture
- {
- v = s.b;
- s.b = s.b - 4;
- }
- return v;
- }
- int
- main ()
- {
- if (f1 () != 11)
- __builtin_abort ();
- f2 (4);
- if (s.a != 210 || s.b != 4 || s.c != 1235)
- __builtin_abort ();
- s.a = 813;
- s.c = 31532;
- if (f1 () != 4)
- __builtin_abort ();
- f3 ();
- if (f1 () != 5)
- __builtin_abort ();
- if (s.a != 813 || s.b != 5 || s.c != 31532)
- __builtin_abort ();
- if (f4 () != 13)
- __builtin_abort ();
- if (f1 () != 13)
- __builtin_abort ();
- f2 (14);
- if (s.a != 813 || s.b != 14 || s.c != 31532)
- __builtin_abort ();
- if (f5 () != 14)
- __builtin_abort ();
- if (f1 () != 10 || s.a != 813 || s.b != 10 || s.c != 31532)
- __builtin_abort ();
- f6 ();
- if (f1 () != 2)
- __builtin_abort ();
- f2 (15);
- f7 ();
- if (f1 () != 8)
- __builtin_abort ();
- if (f8 () != 0 || s.a != 813 || s.b != 0 || s.c != 31532)
- __builtin_abort ();
- if (f9 () != 0 || s.a != 813 || s.b != 12 || s.c != 31532)
- __builtin_abort ();
- return 0;
- }
|