The non-inline specialization of an inline member function of a template class is not being treated as inline when using precompiled headers.
For example, consider test.H: template <class T> class simple_class { public: inline void testfn (T); }; test.C: #include "test.H" template <> void simple_class<int>::testfn (int) {} int main (int argc, char *argv[]) { simple_class<int> sc1; sc1.testfn (5); } When compiled without precompiled headers, the function appears a simple global function: .global _ZN12simple_classIiE6testfnEi But when test.H is first compiled (with "g++ test.H") into a PCH, and then test.C is compiled, the function appears as a weak symbol in a COMDAT section, implying that g++ is considering the specialization "inline" even though it isn't marked as such. .section .text._ZN12simple_classIiE6testfnEi,"axG",% progbits,_ZN12simple_classIiE6testfnEi,comdat .align 2 .weak _ZN12simple_classIiE6testfnEi .type _ZN12simple_classIiE6testfnEi, %function -- Summary: Non-inline function incorrectly treated as inline when using precompiled headers Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jconner at apple dot com CC: gcc-bugs at gcc dot gnu dot org GCC target triplet: arm-none-elf http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23708