/* { dg-do run { target trampolines } } */ /* { dg-options "-O2" } */ /* { dg-additional-sources "tailcall-7.c" } */ struct s { int x; }; extern struct s global; void g1 (void); void g2 (void); void g3 (struct s *); struct s g4 (struct s); struct s g5 (void); struct s g6 (void); struct s g7 (void); struct s g8 (struct s *); int g9 (struct s); int g10 (int); struct s last; struct s tmp; struct s f (int i) { struct s ret; ret.x = i + 100; last = ret; return ret; } void callit (void (*fn) (void)) { fn (); } int test (int last_val, int global_val, int tmp_val) { return last.x == last_val && global.x == global_val && tmp.x == tmp_val; } int main (void) { global.x = 200; tmp.x = 300; g1 (); if (!test (101, 200, 300)) __builtin_abort (); g2 (); if (!test (102, 102, 300)) __builtin_abort (); g3 (&tmp); if (!test (103, 102, 103)) __builtin_abort (); if (g4 (tmp).x != 104 || !test (104, 102, 103)) __builtin_abort (); if (g5 ().x != 105 || !test (105, 102, 103)) __builtin_abort (); if (g6 ().x != 106 || !test (106, 102, 103)) __builtin_abort (); if (g7 ().x != 107 || !test (107, 107, 103)) __builtin_abort (); if (g8 (&tmp).x != 108 || !test (108, 107, 108)) __builtin_abort (); if (g9 (tmp) != 9 || !test (109, 107, 108)) __builtin_abort (); if (g10 (10) != 10 || !test (110, 107, 108)) __builtin_abort (); return 0; }