| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| |
| extern void abort (void); |
| |
| struct node |
| { |
| struct node *next; |
| struct node *prev; |
| }; |
| |
| struct node node; |
| |
| struct head |
| { |
| struct node *first; |
| }; |
| |
| struct head heads[5]; |
| |
| int k = 2; |
| |
| struct head *head = &heads[2]; |
| |
| static int __attribute__((noinline)) |
| foo (void) |
| { |
| node.prev = (void *)head; |
| head->first = &node; |
| |
| struct node *n = head->first; |
| struct head *h = &heads[k]; |
| struct node *next = n->next; |
| |
| if (n->prev == (void *)h) |
| h->first = next; |
| else |
| n->prev->next = next; |
| |
| n->next = h->first; |
| return n->next == &node; |
| } |
| |
| int |
| main (void) |
| { |
| if (foo ()) |
| abort (); |
| return 0; |
| } |