/* 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; }