OSDN Git Service

* c-format.c (check_format_info_main): Don't check for presence of
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 May 2002 20:17:57 +0000 (20:17 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 May 2002 20:17:57 +0000 (20:17 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53118 138bc75d-0d04-0410-961f-82ee72b054a4

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

index b8366ca..33029bb 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 e5be439..470ccf7 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 1a533f3..7ef8018 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" } */
+}