https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84621
Bug ID: 84621 Summary: bogus -Wresturn-type on a template instantiated on a function Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- When a non-void function template that doesn't return value and that is parameterized on a function pointer is instantiated on the address of a noreturn function calls the function, G++ issues a bogus -Wreturn-type warning even though it successfully eliminates statements after the call to the noreturn function (as it should). Interestingly, other compilers suffer the same or similar problem. Clang and ICC issue the same bogus warning while also eliminating the second call, and MSVC doesn't warn or eliminate the call. $ cat b.C && gcc -O -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout b.C template <void f ()> int ff () { f (); f (); // eliminated } // bogus -Wreturn-type void __attribute__ ((noreturn)) f (); template int ff<f>(); b.C: In function ‘int ff()’: b.C:6:1: warning: no return statement in function returning non-void [-Wreturn-type] } // bogus -Wreturn-type ^ ;; Function ff<f> (_Z2ffIXadL_Z1fvEEEiv, funcdef_no=1, decl_uid=2366, cgraph_uid=0, symbol_order=0) ff<f> () { <bb 2> [local count: 1073741825]: f (); }