/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-optimized" } */ struct abc { void (*abc_call)(void); }; /* * Use only any one of the three definitions below at a time: * * 1. nothing optimized away. Good. * 2. call_func() _not_ optimized away, but struct xyz is. gcc disappoints. * 3. both call_func() and struct xyz optimized away. Nice. */ /* 1 */ /*extern int do_register(struct abc *xyz);*/ /* 2 */ static inline int do_register(struct abc *xyz) { return 0; } /* 3 */ /*#define do_register(xyz) do { (void)(xyz); } while (0)*/ static void call_func(void) { } static struct abc xyz = { .abc_call = call_func, }; void func(void) { do_register(&xyz); } /* { dg-final { scan-tree-dump-not "call_func" "optimized"} } */ /* { dg-final { cleanup-tree-dump "optimized" } } */