https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67925
--- Comment #5 from Arkadiusz Drabczyk <arkadiusz at drabczyk dot org> --- -Winline is mentioned in the next paragraph. The whole sentence I posted in the first comment is: "Some calls cannot be integrated for various reasons (in particular, calls that precede the function's definition cannot be integrated, and neither can recursive calls within the definition)." I think it's completely wrong - recursive functions can also be inlined: $ ./gcc --version gcc (GCC) 6.0.0 20151004 (experimental) Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ cat bug1.c #include <stdio.h> #include <stdlib.h> inline static int factorial(unsigned int i) { if(i <= 1) { return 1; } return i * factorial(i - 1); } int main(void) { factorial(12); exit(0); } $ ./gcc bug1.c -O2 -S $ cat bug1.s .file "bug1.c" .section .text.startup,"ax",@progbits .p2align 4,,15 .globl main .type main, @function main: .LFB22: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 xorl %edi, %edi call exit .cfi_endproc .LFE22: .size main, .-main .ident "GCC: (GNU) 6.0.0 20151004 (experimental)" .section .note.GNU-stack,"",@progbits I attach a suggested patch.