https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86141
--- Comment #11 from ASA <aaron_sami_abassi at hotmail dot com> ---
(In reply to Richard Biener from comment #7)
> When you rename main() to foo() the calls are inlined. GCC doesn't inline
> them
> into main() because it knows they are executed exactly once which means they
> are cold and thus code growth doesn't outweight performance increase.
>
> With -Winline you see:
>
> t.C: In function ‘int main()’:
> t.C:31:1: warning: inlining failed in call to ‘void DisplayViewType(const
> ViewType&)’: call is unlikely and code size would grow [-Winline]
> DisplayViewType( const ViewType& view ) {
> ^~~~~~~~~~~~~~~
> t.C:38:20: note: called from here
> DisplayViewType( ViewType::view2( data ) );
> ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
> t.C:31:1: warning: inlining failed in call to ‘void DisplayViewType(const
> ViewType&)’: call is unlikely and code size would grow [-Winline]
> DisplayViewType( const ViewType& view ) {
> ^~~~~~~~~~~~~~~
> t.C:37:20: note: called from here
> DisplayViewType( ViewType::view1( data ) );
> ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> of course in the end the size heuristics are off and inlining would reduce
> code size.
The new version I uploaded moves the code out of main. I just generated the
Assembly output for the new source code version and GCC still does not expand
it inline.