(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
pr20100-1.c
       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  }