Including after gives a warning about redefining the __cpp_lib_array_constexpr macro. What happens is that sets the C++20 value, then redefines it to the C++17 value, then undefines it and defines it again to the C++20 value. This change avoids defining it to the C++17 value when compiling C++20 or later (which also means we no longer need the #undef). A similar warning happens for __cpp_lib_constexpr_char_traits when including after any header that includes . libstdc++-v3/ChangeLog: * include/std/version (__cpp_lib_array_constexpr): (__cpp_lib_constexpr_char_traits): Only define C++17 value when compiling C++17. Tested powerpc64le-linux. Committed to trunk.