Using -O2 or less does not cause this error. Using Linux Redhat ES 2.1 and 3 with this version of gcc: gcc (GCC) 3.2.1 20021125 (Red Hat Linux 8.0 3.2.1-1) Copyright (C) 2002 Free Software Foundation, Inc. and with libstdc++-devel-3.2.3-34 $ cat > stdheaderbug.cpp #include <iostream> int main() { std::cout << 1; return 0; } $ g++ -O3 -Wformat=2 -fmessage-length=0 -Werror stdheaderbug.cpp cc1plus: warnings being treated as errors /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h: In function `int std::__convert_from_v(char*, int, const char*, _Tv, __locale_struct* const&, int) [with _Tv = long unsigned int]': /usr/include/c++/3.2.1/bits/locale_facets.tcc:701: instantiated from `_OutIter std::num_put<_CharT, _OutIter>::_M_convert_int(_OutIter, std::ios_base&, _CharT, char, char, _ValueT) const [with _ValueT = long unsigned int, _CharT = char, _OutIter = std::ostreambuf_iterator<char, std::char_traits<char> >]' /usr/include/c++/3.2.1/bits/locale_facets.tcc:895: instantiated from `_OutIter std::num_put<_CharT, _OutIter>::do_put(_OutIter, std::ios_base&, _CharT, long unsigned int) const [with _CharT = char, _OutIter = std::ostreambuf_iterator<char, std::char_traits<char> >]' /usr/include/c++/3.2.1/bits/locale_facets.h:745: instantiated from `_OutIter std::num_put<_CharT, _OutIter>::put(_OutIter, std::ios_base&, _CharT, long unsigned int) const [with _CharT = char, _OutIter = std::ostreambuf_iterator<char, std::char_traits<char> >]' /usr/include/c++/3.2.1/bits/ostream.tcc:215: instantiated from `std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]' /usr/include/c++/3.2.1/ostream:122: instantiated from `std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]' stdheaderbug.cpp:3: instantiated from here /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:76: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:76: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:78: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:78: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h: In function `int std::__convert_from_v(char*, int, const char*, _Tv, __locale_struct* const&, int) [with _Tv = long int]': /usr/include/c++/3.2.1/bits/locale_facets.tcc:701: instantiated from `_OutIter std::num_put<_CharT, _OutIter>::_M_convert_int(_OutIter, std::ios_base&, _CharT, char, char, _ValueT) const [with _ValueT = long int, _CharT = char, _OutIter = std::ostreambuf_iterator<char, std::char_traits<char> >]' /usr/include/c++/3.2.1/bits/locale_facets.tcc:888: instantiated from `_OutIter std::num_put<_CharT, _OutIter>::do_put(_OutIter, std::ios_base&, _CharT, long int) const [with _CharT = char, _OutIter = std::ostreambuf_iterator<char, std::char_traits<char> >]' /usr/include/c++/3.2.1/bits/locale_facets.h:740: instantiated from `_OutIter std::num_put<_CharT, _OutIter>::put(_OutIter, std::ios_base&, _CharT, long int) const [with _CharT = char, _OutIter = std::ostreambuf_iterator<char, std::char_traits<char> >]' /usr/include/c++/3.2.1/bits/ostream.tcc:188: instantiated from `std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]' /usr/include/c++/3.2.1/ostream:125: instantiated from `std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]' stdheaderbug.cpp:3: instantiated from here /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:76: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:76: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:78: warning: format not a string literal, argument types not checked /usr/include/c++/3.2.1/i386-redhat-linux/bits/c++locale.h:78: warning: format not a string literal, argument types not checked $
Fixed since 3.3.