[Patch] Warning during GCC bootstrap on i686-pc-mingw32
Kai Tietz
Kai.Tietz@onevision.com
Wed Apr 16 10:56:00 GMT 2008
"Danny Smith" <dansmister@gmail.com> wrote on 16.04.2008 03:52:18:
> As noted in
> http://gcc.gnu.org/ml/gcc/2008-04/msg00371.html
>
> the pedantic warning for the use of "I64" printf length specifier
> "../../src/gcc/cfg.c:540: warning: ISO C does not support the ''
> ms_printf length modifier"
> is wrong.
>
> The problem is in the use of '\0' as a prefix to flag multichar length
> specs string.
>
> This patch gets rid of the use of a terminator as a prefix and simply
> uses strncmp to handle
> the comparison .
>
> Tested i686-pc-mingw32.
>
> OK for trunk?
>
> 2008-04-16 Danny Smith <dannysmith@users.net>
>
> * c-format.c (check_format_info_main): Use strncmp rather than a
> magic prefix
> to handle multichar length specs.
> * config/i386/msformat-c.c (format_length_info
ms_printf_length_specs):
> Don't prefix "I64" and "I32" with '\0'.
>
> Index: c-format.c
> ===================================================================
> --- c-format.c (revision 134294)
> +++ c-format.c (working copy)
> @@ -1779,26 +1779,12 @@
> length_chars_std = STD_C89;
> if (fli)
> {
> - while (fli->name != 0 && fli->name[0] != *format_chars)
> - {
> - if (fli->name[0] == '\0')
> - {
> - int si = strlen (fli->name + 1) + 1;
> - int i = 1;
> - while (fli->name[i] != 0 && fli->name[i] == format_chars [i -
1])
> - ++i;
> - if (si == i)
> - {
> - if (si > 2)
> - format_chars += si - 2;
> - break;
> - }
> - }
> + while (fli->name != 0
> + && strncmp (fli->name, format_chars, strlen (fli->name)))
> fli++;
> - }
> if (fli->name != 0)
> {
> - format_chars++;
> + format_chars += strlen (fli->name);
> if (fli->double_name != 0 && fli->name[0] == *format_chars)
> {
> format_chars++;
> Index: config/i386/msformat-c.c
> ===================================================================
> --- config/i386/msformat-c.c (revision 134294)
> +++ config/i386/msformat-c.c (working copy)
> @@ -38,8 +38,8 @@
> {
> { "h", FMT_LEN_h, STD_C89, NULL, 0, 0 },
> { "l", FMT_LEN_l, STD_C89, NULL, 0, 0 },
> - { "\0I32", FMT_LEN_l, STD_EXT, NULL, 0, 0 },
> - { "\0I64", FMT_LEN_ll, STD_EXT, NULL, 0, 0 },
> + { "I32", FMT_LEN_l, STD_EXT, NULL, 0, 0 },
> + { "I64", FMT_LEN_ll, STD_EXT, NULL, 0, 0 },
> { "I", FMT_[PatchLEN_L, STD_EXT, NULL, 0, 0 },
> { NULL, 0, 0, NULL, 0, 0 }
> };
>
AFAICS does this patch won't work. Because it breaks as example "l"/"ll"
checking in default case (gnu_printf). I think it is better to use a macro
on output for ->name. Something like this:
#define MAY_LEADZERO(NAME) ((NAME) + (((NAME)[0])==0 ? 1 : 0)
Cheers,
Kai
| (\_/) This is Bunny. Copy and paste Bunny
| (='.'=) into your signature to help him gain
| (")_(") world domination.
More information about the Gcc-patches
mailing list