http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54224
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization --- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-08-15 13:04:15 UTC --- Some further observations: a) Inlining: It fails according to -fdump-ipa-inline because of: not inlinable: say_hello/1 -> hello_integer/0, --param large-stack-frame-growth limit reached Still, given that there is only one user of the function, one should expect that the function gets inlined. For the following [(c) and (d)], I have the impression that the warning is generated at the wrong spot. b) I failed to generate a C version of the failing test case of comment 0. c) For the program in comment 0, one enters rtx_for_function_call and one properly calls those lines: 1678 if (!TREE_USED (fndecl) && fndecl != current_function_decl) 1679 TREE_USED (fndecl) = 1; for <function_decl 0x2aaaac2a0300 hello_integer However, that function is called *AFTER* check_global_declaration_1 and comes thus too late. d) There is no warning for internal procedures even though there should be: program test contains subroutine unused () end subroutine unused end program test nor for the C version (compile with -std=gnu99 as nested functions is an extension): #include <stdio.h> int main () { void foo() { }; printf("Hello World!\n"); return 0; } Given that "foo" and "unused" aren't global declarations, that's probably not surprising.