#include __attribute__((noinline)) int foo(int x, int y) { return x * (y + 3); } __attribute__((noinline)) int bar(int x, int y) { return x - y; } typedef int (*footype)(int, int); __attribute__((noinline)) int calls_fptr(volatile footype fptr, int z) { return fptr(2, 3) + z; } __attribute__((noinline)) footype get_function_ptr(bool b) { if (b) { return &foo; } else { return &bar; } } int fptr_driver() { int (*volatile fptr)(int, int) = get_function_ptr(true); return calls_fptr(fptr, 10); } struct StructWithFuncPtr { int anInt; int (*fptr)(int, int); }; __attribute((noinline)) int calls_through_struct(volatile struct StructWithFuncPtr *s) { return s->fptr(s->anInt, 2); } int struct_driver() { volatile struct StructWithFuncPtr s = { 0 }; s.fptr = get_function_ptr(true); s.anInt = 3; return calls_through_struct(&s); }