/* { dg-do compile } */ /* { dg-options "-O2 -fcf-protection" } */ /* { dg-require-ifunc "" } */ /* { dg-final { scan-assembler-times {\mendbr} 4 } } */ int resolver_fn = 0; int resolved_fn = 0; static inline void do_it_right_at_runtime_A (void) { resolved_fn++; } static inline void do_it_right_at_runtime_B (void) { resolved_fn++; } static inline void do_it_right_at_runtime (void); void do_it_right_at_runtime (void) __attribute__ ((ifunc ("resolve_do_it_right_at_runtime"))); extern int r; static void (*resolve_do_it_right_at_runtime (void)) (void) { resolver_fn++; typeof(do_it_right_at_runtime) *func; if (r & 1) func = do_it_right_at_runtime_A; else func = do_it_right_at_runtime_B; return (void *) func; } int main () { do_it_right_at_runtime (); return 0; }