| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-additional-sources "tailcall-8.c" } */ |
| |
| struct s { int x; }; |
| |
| int expected; |
| struct s *last_ptr; |
| struct s tmp; |
| |
| void |
| start (int val, struct s *initial_last_ptr) |
| { |
| expected = val; |
| tmp.x = val; |
| last_ptr = initial_last_ptr; |
| } |
| |
| void |
| f_direct (struct s param) |
| { |
| if (param.x != expected) |
| __builtin_abort (); |
| } |
| |
| void |
| f_indirect (struct s *ptr) |
| { |
| if (ptr->x != expected) |
| __builtin_abort (); |
| last_ptr = ptr; |
| ptr->x += 100; |
| } |
| |
| void |
| f_void (void) |
| { |
| if (last_ptr->x != expected + 100) |
| __builtin_abort (); |
| } |
| |
| |
| void g1 (struct s); |
| void g2 (struct s *); |
| void g3 (struct s *); |
| void g4 (struct s *); |
| void g5 (struct s); |
| void g6 (struct s); |
| void g7 (struct s); |
| void g8 (struct s *); |
| void g9 (struct s *); |
| |
| int |
| main (void) |
| { |
| struct s g6_s = { 106 }; |
| |
| start (1, 0); |
| g1 (tmp); |
| |
| start (2, 0); |
| g2 (&tmp); |
| |
| start (3, 0); |
| g3 (&tmp); |
| |
| start (4, 0); |
| g4 (&tmp); |
| |
| start (5, 0); |
| g5 (tmp); |
| |
| start (6, &g6_s); |
| g6 (tmp); |
| |
| start (7, 0); |
| g7 (tmp); |
| |
| start (8, 0); |
| g8 (&tmp); |
| |
| start (9, 0); |
| g9 (&tmp); |
| |
| return 0; |
| } |