While testing a libstdc++ patch that relies on inlining to expose a GCC limitation I noticed that the same member function of a class template is inlined into one function in the test but not into the other, even though it is inlined into each if each is compiled separately (i.e., in a file on its own).
I wasn't aware that inlining decisions made in one function could affect those in another, or in the whole file. Is that expected? And if yes, what's the rationale? Here's a simplified test case. When compiled with -O2 or -O3 and either just -DFOO or just -DBAR, the call to vector::resize() and all the functions called from it, including (crucially) vector::_M_default_append, are inlined. But when compiled with -DFOO -DBAR _M_default_append is not inlined. With a somewhat more involved test case I've also seen the first call inlined but not the second, which was also surprising to me. #include <vector> void sink (std::vector<int>&); #if FOO void foo (unsigned n) { std::vector<int> a; a.resize (n); sink (a); } #endif #if BAR void bar (unsigned long n) { std::vector<int> a; a.resize (n); sink (a); } #endif Thanks Martin