1  /* { dg-do link } */
       2  /* { dg-options "-fno-allow-store-data-races" } */
       3  /* { dg-final { simulate-thread } } */
       4  
       5  #include <stdio.h>
       6  #include "../../gcc.dg/simulate-thread/simulate-thread.h"
       7  
       8  /* Store into <c> should not clobber <d>.  */
       9  
      10  struct bits
      11  {
      12    char a;
      13    int b:7;
      14    int c:9;
      15    unsigned char d;
      16  } var;
      17  
      18  static int global = 0;
      19  
      20  void simulate_thread_other_threads()
      21  {
      22    global++;
      23    var.d = global;
      24  }
      25  
      26  int simulate_thread_step_verify()
      27  {
      28    if (var.d != global)
      29      {
      30        printf("FAIL: invalid intermediate result\n");
      31        return 1;
      32      }
      33    return 0;
      34  }
      35  
      36  int simulate_thread_final_verify()
      37  {
      38    if (var.c != 5)
      39      {
      40        printf("FAIL: invalid final result\n");
      41        return 1;
      42      }
      43    return 0;
      44  }
      45  
      46  __attribute__((noinline))
      47  void update_c(struct bits *p, int val) 
      48  {
      49      p -> c = val;
      50  }
      51  
      52  __attribute__((noinline))
      53  void simulate_thread_main()
      54  {
      55    update_c(&var, 5);
      56  }
      57  
      58  int main()
      59  {
      60    simulate_thread_main();
      61    simulate_thread_done();
      62    return 0;
      63  }