Just so it is somewhere, here is a testcase that we can't inline leaf functions to always_inlines unless we do some tracking of what calls were formerly indirect calls.
We really overloaded always_inline from the original semantics "drop inlining heuristics" into "be sure that result is inlined" while for the second it does not make sense to take its address. Clang apparently simply does not error on failes always inlines which makes its life easier. int n; typedef void (*fnptr)(); fnptr get_me(); __attribute__ ((always_inline)) inline void test(void) { if (n < 10) (get_me())(); n++; return; } fnptr get_me() { return test; } void foo() { test(); }