c-format.c (check_format_info_main): Use strncmp rather than a magic prefix to handle...
authorDanny Smith <dannysmith@users.sourceforge.net>
Thu, 24 Apr 2008 07:42:07 +0000 (07:42 +0000)
committerDanny Smith <dannysmith@gcc.gnu.org>
Thu, 24 Apr 2008 07:42:07 +0000 (07:42 +0000)
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

gcc/ChangeLog
gcc/c-format.c
gcc/config/i386/msformat-c.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/format/ms-warnI64-1.c [new file with mode: 0644]

index 08b6230876b3cb16b270d98f3d2a12333ad18646..1c9599e547a17cb3dc62d0d55291543813f5070f 100644 (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
index d1a136f87ec5fc211e8403ca1991ee94bafda486..82f5ff39bc975ec0a095e26f1f5e44f3485b072f 100644 (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++;
index 821be470b8ede9df5a2b7df14192e072bac5907b..90365557a69e8aba4bafb358d7b10f2243b14018 100644 (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 }
 };
index 2332f6908f92af6d76a2bb20390ff98f9d54e07c..b533b938dc8e0dab99eb6069c7e46119421787f4 100644 (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
diff --git a/gcc/testsuite/gcc.dg/format/ms-warnI64-1.c b/gcc/testsuite/gcc.dg/format/ms-warnI64-1.c
new file mode 100644 (file)
index 0000000..b5d31d2
--- /dev/null
@@ -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" } */
+}