https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104597
Bug ID: 104597 Summary: LTO does not inline indirect call Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: m.cencora at gmail dot com Target Milestone: --- Given following files: // main.cpp using intfunc = int (*)(); intfunc getIntFunc(int i); namespace { int test() { auto func = getIntFunc(1); return func(); } } int main() { return test(); } // lib1.cpp namespace { int getInt0() { return 0; } int getInt1() { return 1; } int getInt2() { return 2; } } using intfunc = int (*)(); intfunc getIntFunc(int i) { if (i == 0) { return getInt0; } else if (i == 1) { return getInt1; } else if (i == 2) { return getInt2; } __builtin_abort(); } and compilation with: g++ -std=c++20 -Wall -Wextra -O3 -flto -fvisibility=hidden -fvisibility-inlines-hidden -ffunction-sections -Wl,-gc-sections main.cpp lib1.cpp -o test Call to getInt1 does not get inlined: Dump of assembler code for function main: 0x0000000000001040 <+0>: endbr64 0x0000000000001044 <+4>: jmp 0x1140 <_ZN12_GLOBAL__N_17getInt1Ev>