(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
simulate-thread/
bitfields-1.c
       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  /* Test that we don't store past VAR.A.  */
       9  
      10  struct S
      11  {
      12    volatile unsigned int a : 4;
      13    unsigned char b;
      14    unsigned int c : 6;
      15  } var = { 1, 2, 3 };
      16  
      17  static int global = 0;
      18  
      19  /* Called before each instruction, simulating another thread
      20     executing.  */
      21  void simulate_thread_other_threads()
      22  {
      23    global++;
      24    var.b = global;
      25    /* Don't go past the 6 bits var.c can hold.  */
      26    var.c = global % 64;
      27  }
      28  
      29  /* Called after each instruction.  Returns 1 if any inconsistency is
      30     found, 0 otherwise.  */
      31  int simulate_thread_step_verify()
      32  {
      33    int ret = 0;
      34    if (var.b != global)
      35      {
      36        printf("FAIL: invalid intermediate value for <b>.\n");
      37        ret = 1;
      38      }
      39    if (var.c != global % 64)
      40      {
      41        printf("FAIL: invalid intermediate value for <c>.\n");
      42        ret = 1;
      43      }
      44    return ret;
      45  }
      46  
      47  /* Called at the end of the program (simulate_thread_fini == 1).  Verifies
      48     the state of the program and returns 1 if any inconsistency is
      49     found, 0 otherwise.  */
      50  int simulate_thread_final_verify()
      51  {
      52    if (var.a != 12)
      53      {
      54        printf("FAIL: invalid final result for <a>.\n");
      55        return 1;
      56      }
      57    return 0;
      58  }
      59  
      60  __attribute__((noinline))
      61  void simulate_thread_main()
      62  {
      63    var.a = 12;
      64  }
      65  
      66  int main()
      67  {
      68    simulate_thread_main();
      69    simulate_thread_done();
      70    return 0;
      71  }