OSDN Git Service

Backported from mainline
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.c-torture / execute / pr39100.c
1 /* Bad PTA results (incorrect store handling) was causing us to delete
2    *na = 0 store.  */
3
4 typedef struct E
5 {
6   int p;
7   struct E *n;
8 } *EP;   
9
10 typedef struct C
11 {
12   EP x;
13   short cn, cp; 
14 } *CP;
15
16 __attribute__((noinline)) CP
17 foo (CP h, EP x)
18 {
19   EP pl = 0, *pa = &pl;
20   EP nl = 0, *na = &nl;
21   EP n;
22
23   while (x)
24     {
25       n = x->n;   
26       if ((x->p & 1) == 1) 
27         {
28           h->cp++;
29           *pa = x;
30           pa = &((*pa)->n);
31         }
32       else
33         {
34           h->cn++;
35           *na = x;
36           na = &((*na)->n);
37         }    
38       x = n;
39     }
40   *pa = nl;
41   *na = 0;
42   h->x = pl;
43   return h;
44 }
45
46 int
47 main (void)
48 {  
49   struct C c = { 0, 0, 0 };
50   struct E e[2] = { { 0, &e[1] }, { 1, 0 } };
51   EP p;
52
53   foo (&c, &e[0]);
54   if (c.cn != 1 || c.cp != 1)
55     __builtin_abort ();
56   if (c.x != &e[1])
57     __builtin_abort ();
58   if (e[1].n != &e[0])
59     __builtin_abort ();
60   if (e[0].n)
61     __builtin_abort ();
62   return 0;  
63 }
64
65