On Fri, Aug 19, 2016 at 12:16 PM, Andy Ross <andrew.j.r...@intel.com> wrote: > 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.
Couple of things missing here. A changelog is the first thing. The second thing is it seems like Zephyr project should be using the PRIdx, etc. instead of just %d for int32_t to be portable. Thanks, Andrew > > 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 >