| /* { dg-do link { target { ! int16 } } } */ | |
| /* { dg-options "-fno-allow-store-data-races" } */ | |
| /* { dg-final { simulate-thread } } */ | |
| #include <stdio.h> | |
| #include "../../gcc.dg/simulate-thread/simulate-thread.h" | |
| /* Test that we don't store past VAR.K. */ | |
| struct S | |
| { | |
| volatile int i; | |
| volatile int j: 32; | |
| volatile int k: 15; | |
| volatile unsigned char c[2]; | |
| } var; | |
| static int global = 0; | |
| void simulate_thread_other_threads() | |
| { | |
| global++; | |
| var.c[0] = global % 256; | |
| var.c[1] = global % 256; | |
| } | |
| int simulate_thread_step_verify() | |
| { | |
| if (var.c[0] != global % 256 | |
| || var.c[1] != global % 256) | |
| { | |
| printf("FAIL: invalid intermediate result for <var.c[]>.\n"); | |
| return 1; | |
| } | |
| return 0; | |
| } | |
| int simulate_thread_final_verify() | |
| { | |
| if (var.k != 13) | |
| { | |
| printf("FAIL: invalid final result\n"); | |
| return 1; | |
| } | |
| return 0; | |
| } | |
| __attribute__((noinline)) | |
| void simulate_thread_main() | |
| { | |
| var.k = 13; | |
| } | |
| int main() | |
| { | |
| simulate_thread_main(); | |
| simulate_thread_done(); | |
| return 0; | |
| } |