c-format.c (check_format_info_main): Use strncmp rather than a magic prefix to handle multichar length specs.

gcc
	* 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'.


testsuite
	* gcc.dg/format/ms-warnI64-1.c: New file.

From-SVN: r134623
This commit is contained in:
Danny Smith 2008-04-24 07:42:07 +00:00 committed by Danny Smith
parent 64ceac43df
commit f9f9640f84
5 changed files with 44 additions and 19 deletions

View File

@ -1,3 +1,10 @@
2008-04-24 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'.
2008-04-24 Jakub Jelinek <jakub@redhat.com>
PR target/36015

View File

@ -1779,26 +1779,12 @@ check_format_info_main (format_check_results *res,
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++;

View File

@ -38,8 +38,8 @@ static const format_length_info ms_printf_length_specs[] =
{
{ "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_LEN_L, STD_EXT, NULL, 0, 0 },
{ NULL, 0, 0, NULL, 0, 0 }
};

View File

@ -1,3 +1,7 @@
2008-04-24 Danny Smith <dannysmith@users.net>
* gcc.dg/format/ms-warnI64-1.c: New file.
2008-04-24 Jakub Jelinek <jakub@redhat.com>
PR target/36015

View File

@ -0,0 +1,28 @@
/* Test for printf formats. Test for ISO C warnings with MS "I64"
extension.*/
/* { dg-do compile { target { *-*-mingw* } } } */
/* { dg-options "-std=iso9899:1990 -pedantic -Wformat -Wno-long-long" } */
#define USE_SYSTEM_FORMATS
#include "format.h"
void
foo (long long ll, unsigned long long ull, long long *lln,
long long *llp, unsigned long long *ullp)
{
printf ("%I64d", ll); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64d" } */
printf ("%I64i", ll); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64i" } */
printf ("%I64o", ull); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64o" } */
printf ("%I64u", ull); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64u" } */
printf ("%I64x", ull); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64x" } */
printf ("%I64X", ull); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64X" } */
printf ("%I64n", lln); /* { dg-warning "'I64' ms_printf length modifier" "printf %I64n" } */
scanf ("%I64d", llp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64d" } */
scanf ("%I64i", llp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64i" } */
scanf ("%I64o", ullp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64o" } */
scanf ("%I64u", ullp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64u" } */
scanf ("%I64x", ullp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64x" } */
scanf ("%I64X", ullp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64X" } */
scanf ("%I64n", llp); /* { dg-warning "'I64' ms_scanf length modifier" "scanf %I64n" } */
}