Re: fixes for type-punning warnings in GCC 4.1

Daniel Jacobowitz
2006-01-22T20:33:28Z

On Mon, Jan 16, 2006 at 04:26:57PM -0200, Alexandre Oliva wrote:
> On Dec 19, 2005, Daniel Jacobowitz <drow@false.org> wrote:
>
> >> > From: Alexandre Oliva <aoliva@redhat.com>
> >> > Date: Mon, 19 Dec 2005 17:20:48 -0200
>
> >> > - num = sscanf (p, "%g%s", (float *) &putithere->typed_val_float.dval,s);
> >> > + num = sscanf (p, "%g%s", (float *) (void *) &putithere->typed_val_float.dval,s);
>
> > We should fix it properly, in any case. The right solution here is
> > pretty apparent: delete the "float" case, and #define appropriate
> > format characters for DOUBLEST in doublest.h, in the same place we
> > typedef DOUBLEST. Just like GCC's HOST_WIDE_INT_PRINT.
>
> We can't quite do that because we may have to issue more complex
> command patterns than simply a plain sscanf into the output location.
> I've come up with this macro that defers to a static inline function
> in the complex case. Is this change acceptable? Tested on
> amd64-linux-gnu.
>
> Another alternative that I found uglier would be to define a
> DOUBLEST_SCAN macro and a DOUBLEST_SCAN_TYPE typedef, and always
> declare a variable of DOUBLEST_SCAN_TYPE, scan into it, and then copy
> the scanned value to the given output variable. This enables people
> to construct more complex scan patterns, but is it worth the ugliness
> and extra copying for the sake of the uncommon `has long double but
> can't scanf it' case?

The output is always a DOUBLEST. I don't know of any reason why we
should enable HAVE_LONG_DOUBLE if we can't printf and scanf them; would
this be simpler in that case? Don't make DOUBLEST something we can't
scan or print.

--
Daniel Jacobowitz
CodeSourcery