Sample code on Compiler Explorer: https://godbolt.org/g/fPfw4k
I was attempting to use an array of function pointers as a jump table instead of switches as I found it to be cleaner. However, to my surprise, neither GCC nor Clang compiler seems capable of inlining this.
Is there a specific reason why?
Example code incase of dead link:
namespace{
template<int N>
int bar(){
    return N;
}
int foo1(int n){
     if(n < 0 || n > 5){
        __builtin_unreachable();
    }
    #if __clang__
    __builtin_assume(n >= 0 && n <= 5);
    #endif
    static int (* const fns[])() = {
        bar<0>, bar<1>, bar<2>, bar<3>, bar<4>, bar<5>
    };
    return fns[n]();
}
int foo2(int n){
    #if __clang__
    __builtin_assume(n >= 0 && n <= 5);
    #endif
    switch(n){
        case 0:
            return bar<0>();
        case 1:
            return bar<1>();
        case 2:
            return bar<2>();
        case 3:
            return bar<3>();
        case 4:
            return bar<4>();
        case 5:
            return bar<5>();
        default:
            __builtin_unreachable();
    }
}
}
int main(int argc, char** argv){
    volatile int n = foo1(argc);
    volatile int p = foo2(argc);
}
Using the language extension attribute always_inline provided by GCC & Clang makes no difference either.
 
    