We ran into this issue in the Zephyr project with our toolchain (gcc built with --enable-newlib). Basically GCC appears to be honoring a legacy requirement to give newlib a "long" instead of "int" for __INT32_TYPE__, which then leaks out through the current newlib headers as a long-valued int32_t, which produces gcc warnings when a uint32_t is passed to an unqualified printf format specifier like "%d".
But the newlib headers, if __INT32_TYPE__ is *not* defined by the compiler, have code to chose a "int" over "long" immediately thereafter. It seems whatever requirement this was honoring isn't valid anymore. >From 784fb1760a930d0309f878bbae7bfd38137f5689 Mon Sep 17 00:00:00 2001 From: Andy Ross <andrew.j.r...@intel.com> Date: Fri, 19 Aug 2016 09:40:42 -0700 Subject: [PATCH] newlib-stdint.h: Remove 32 bit longs This would make __INT32_TYPE__ a "long" instead of an "int", which would then percolate down in newlib's own headers into a typedef for int32_t. Which is wrong. Newlib's headers, if __INT32_TYPE__ were not defined, actually would chose an int for this type. The comment that newlib uses a 32 bit long appears to be a lie, perhaps historical. Signed-off-by: Andy Ross <andrew.j.r...@intel.com> --- gcc/config/newlib-stdint.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gcc/config/newlib-stdint.h b/gcc/config/newlib-stdint.h index eb99556..0275948 100644 --- a/gcc/config/newlib-stdint.h +++ b/gcc/config/newlib-stdint.h @@ -22,10 +22,9 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ -/* newlib uses 32-bit long in certain cases for all non-SPU - targets. */ +/* newlib used to use a 32-bit long, no longer */ #ifndef STDINT_LONG32 -#define STDINT_LONG32 (LONG_TYPE_SIZE == 32) +#define STDINT_LONG32 0 #endif #define SIG_ATOMIC_TYPE "int" -- 2.7.4