diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 199acc114b7..ed9f7194101 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-02-23 Hans-Peter Nilsson + + PR tree-optimization/20100 + * gcc.c-torture/execute/pr20100-1.c: New test. + 2005-02-23 Tobias Schl"uter * gfortran.dg/implicit_3.f90: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c b/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c new file mode 100644 index 00000000000..8782edcd845 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr20100-1.c @@ -0,0 +1,76 @@ +/* PR tree-optimization/20100 + Pure function being treated as const. + Author: Hans-Peter Nilsson. */ + +static unsigned short g = 0; +static unsigned short p = 0; +unsigned char e; + +static unsigned short +next_g (void) +{ + return g == e - 1 ? 0 : g + 1; +} + +static unsigned short +curr_p (void) +{ + return p; +} + +static unsigned short +inc_g (void) +{ + return g = next_g (); +} + +static unsigned short +curr_g (void) +{ + return g; +} + +static char +ring_empty (void) +{ + if (curr_p () == curr_g ()) + return 1; + else + return 0; +} + +char +frob (unsigned short a, unsigned short b) +{ + g = a; + p = b; + inc_g (); + return ring_empty (); +} + +unsigned short +get_n (void) +{ + unsigned short n = 0; + unsigned short org_g; + org_g = curr_g (); + while (!ring_empty () && n < 5) + { + inc_g (); + n++; + } + + return n; +} + +void abort (void); +void exit (int); +int main (void) +{ + e = 3; + if (frob (0, 2) != 0 || g != 1 || p != 2 || e != 3 + || get_n () != 1 + || g != 2 || p != 2) + abort (); + exit (0); +}