https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69865
--- Comment #4 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- when working on a patch I noticed that there is something more... that is if the preprocessor macro __GNUC_GNU_INLINE__ or __GNUC_STDC_INLINE__ is defined on C++. Actually that is irrellevant to C++, but it can trigger bugs in c++ headers for instance in gcc/cp/cfns.h: we have there: #ifdef __GNUC__ __inline #endif const char * libc_name_p (const char *, unsigned int); ... #ifdef __GNUC__ __inline #ifdef __GNUC_STDC_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const char * libc_name_p (register const char *str, register unsigned int len) => error: different attributes. The status quo is: if we do not sepecify -std= on the command line (implicitly -std=gnu++14) we have __GNUC_GNU_INLINE__ defined. but if we define -std=gnu++14 to -std=c++11 on the command line, we have __GNUC_STDC_INLINE__ defined. if we define -std=c++03 on the command line, we get __GNUC_GNU_INLINE__. I think the c++ FE does nothing with the flag_gnu89_inline. I dont know what the right fix is here: a) define __GNUC_GNU_INLINE__ in C++ b) define __GNUC_STDC_INLINE__ in C++ and fix gcc/cp/cfns.h c) define neither __GNUC_GNU_INLINE__ nor _GNUC_STDC_INLINE__ in C++ c feels right, but may break other things on other header files. a feels wrong, this is what probably most header files expect.