https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69657
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-02-03 Component|libstdc++ |c++ Summary|[6 Regression] abs() not |abs() not inlined after |inlined after including |including math.h |math.h | Ever confirmed|0 |1 --- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #2) > using foo::abs; I forgot to mention that without this line you get the expected output. The same thing happens with no mention of std and no libstdc++ headers at all: namespace foo { inline double abs(double x) { return __builtin_fabs(x); } } using foo::abs; extern "C" int abs(int); namespace bar { using ::abs; } int wrap_abs (int x) { return bar::abs (x) + bar::abs(x); } It seems that overloading a built-in prevents it being recognised as a built-in. Recategorising as component=c++, and removing the regression marker (because the change in libstdc++ that reveals this issue is required for conformance).