re PR c/6547 (misleading printf '$' format)
authorJoseph Myers <jsm28@cam.ac.uk>
Fri, 3 May 2002 20:17:57 +0000 (21:17 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 3 May 2002 20:17:57 +0000 (21:17 +0100)
* c-format.c (check_format_info_main): Don't check for presence of
parameter for * width until after operand number has been read,
and only check for it if format parameters are available.
Fixes PR c/6547.

testsuite:
* gcc.dg/format/xopen-2.c: New test.

From-SVN: r53118

gcc/ChangeLog
gcc/c-format.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/format/xopen-2.c [new file with mode: 0644]

index b8366ca718753ee342fa5681a522fe098263ea22..33029bb6b15cdce550fc895c8d13344f088a8d5e 100644 (file)
@@ -1,3 +1,10 @@
+2002-05-03  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * c-format.c (check_format_info_main): Don't check for presence of
+       parameter for * width until after operand number has been read,
+       and only check for it if format parameters are available.
+       Fixes PR c/6547.
+
 2002-05-03  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * config/alpha/netbsd.h (CPP_PREDEFINES): Add -D_LP64.
index e5be439c53fb9bd39d398b5d51134e988b868807..470ccf7b3d62daf46a95ab6fe1c6e507f7a15cd8 100644 (file)
@@ -1751,11 +1751,6 @@ check_format_info_main (status, res, info, format_chars, format_length,
              /* "...a field width...may be indicated by an asterisk.
                 In this case, an int argument supplies the field width..."  */
              ++format_chars;
-             if (params == 0)
-               {
-                 status_warning (status, "too few arguments for format");
-                 return;
-               }
              if (has_operand_number != 0)
                {
                  int opnum;
@@ -1775,6 +1770,11 @@ check_format_info_main (status, res, info, format_chars, format_length,
                }
              if (info->first_arg_num != 0)
                {
+                 if (params == 0)
+                   {
+                     status_warning (status, "too few arguments for format");
+                     return;
+                   }
                  cur_param = TREE_VALUE (params);
                  if (has_operand_number <= 0)
                    {
index 1a533f3753f9f25fe59465580cfca7519ffb3c9a..7ef80186c9896690c14ec0f1e6392cbedbfae1b0 100644 (file)
@@ -1,3 +1,7 @@
+2002-05-03  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * gcc.dg/format/xopen-2.c: New test.
+
 2002-05-03  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.dg/20020503-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/format/xopen-2.c b/gcc/testsuite/gcc.dg/format/xopen-2.c
new file mode 100644 (file)
index 0000000..5b83731
--- /dev/null
@@ -0,0 +1,21 @@
+/* Test for X/Open format extensions, as found in the
+   Single Unix Specification.  Test for bug reported by
+   Pierre-Canalsat PETIT <pierrecanalsat.petit.canalsat@canal-plus.com>
+   in PR c/6547.  The test for absence of a parameter for a * width was done
+   too early in the case of operand numbers and vprintf formats.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -Wformat" } */
+
+#include "format.h"
+
+void vbar (va_list, const char *) __attribute__((__format__(__printf__, 2, 0)));
+
+void
+foo (int i, int j, va_list va)
+{
+  printf("%2$*1$c", i, j);
+  printf("%2$*1$c %2$*1$c", i, j); /* { dg-bogus "too few" "bogus too few dollar" } */
+  vbar(va, "%*s"); /* { dg-bogus "too few" "bogus too few vprintf" } */
+}