modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c (about)

     1  /* PR tree-optimization/20100
     2     Pure function being treated as const.
     3     Author: Hans-Peter Nilsson.  */
     4  
     5  static unsigned short g = 0;
     6  static unsigned short p = 0;
     7  unsigned char e;
     8  
     9  static unsigned short
    10  next_g (void)
    11  {
    12    return g == e - 1 ? 0 : g + 1;
    13  }
    14  
    15  static unsigned short
    16  curr_p (void)
    17  {
    18    return p;
    19  }
    20  
    21  static unsigned short
    22  inc_g (void)
    23  {
    24    return g = next_g ();
    25  }
    26  
    27  static unsigned short
    28  curr_g (void)
    29  {
    30    return g;
    31  }
    32  
    33  static char
    34  ring_empty (void)
    35  {
    36    if (curr_p () == curr_g ())
    37      return 1;
    38    else
    39      return 0;
    40  }
    41  
    42  char
    43  frob (unsigned short a, unsigned short b)
    44  {
    45    g = a;
    46    p = b;
    47    inc_g ();
    48    return ring_empty ();
    49  }
    50  
    51  unsigned short
    52  get_n (void)
    53  {
    54    unsigned short n = 0;
    55    unsigned short org_g;
    56    org_g = curr_g ();
    57    while (!ring_empty () && n < 5)
    58      {
    59        inc_g ();
    60        n++;
    61      }
    62  
    63    return n;
    64  }
    65  
    66  void abort (void);
    67  void exit (int);
    68  int main (void)
    69  {
    70    e = 3;
    71    if (frob (0, 2) != 0 || g != 1 || p != 2 || e != 3
    72        || get_n () != 1
    73        || g != 2 || p != 2)
    74      abort ();
    75    exit (0);
    76  }