/* { dg-do compile { target trampolines } } */ /* { dg-options "-O2 -fdump-tree-tailc-details" } */ struct s { int x; }; struct s f (int); struct s global; void callit (void (*) (void)); /* Tail call. */ void g1 (void) { f (1); } /* Not a tail call. */ void g2 (void) { global = f (2); } /* Not a tail call. */ void g3 (struct s *ptr) { *ptr = f (3); } /* Tail call. */ struct s g4 (struct s param) { param = f (4); return param; } /* Tail call. */ struct s g5 (void) { struct s local = f (5); return local; } /* Tail call. */ struct s g6 (void) { return f (6); } /* Not a tail call. */ struct s g7 (void) { struct s local = f (7); global = local; return local; } /* Not a tail call. */ struct s g8 (struct s *ptr) { struct s local = f (8); *ptr = local; return local; } /* Not a tail call. */ int g9 (struct s param) { void inner (void) { param = f (9); } callit (inner); return 9; } /* Tail call. */ int g10 (int param) { void inner (void) { f (param); } callit (inner); return 10; } /* { dg-final { scan-tree-dump-times "Found tail call" 5 "tailc" } } */