OSDN Git Service

* c-common.c (check_function_format): Don't suggest adding format
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 9 Dec 2000 21:26:56 +0000 (21:26 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 9 Dec 2000 21:26:56 +0000 (21:26 +0000)
attributes to functions with no parameter to which to add them.

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

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

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

index e8bc306..ea745cd 100644 (file)
@@ -1,3 +1,8 @@
+2000-12-09  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * c-common.c (check_function_format): Don't suggest adding format
+       attributes to functions with no parameter to which to add them.
+
 2000-12-09  Nick Clifton  <nickc@redhat.com>
 
        * config/arm/arm.c (arm_expand_prologue): Mark the generated
index 2baba02..1e766e6 100644 (file)
@@ -2047,8 +2047,25 @@ check_function_format (status, name, assembler_name, params)
                    && info2->format_type == info->format_type)
                  break;
              if (info2 == NULL)
-               warning ("function might be possible candidate for `%s' format attribute",
-                        format_types[info->format_type].name);
+               {
+                 /* Check if the current function has a parameter to which
+                    the format attribute could be attached; if not, it
+                    can't be a candidate for a format attribute, despite
+                    the vprintf-like or vscanf-like call.  */
+                 tree args;
+                 for (args = DECL_ARGUMENTS (current_function_decl);
+                      args != 0;
+                      args = TREE_CHAIN (args))
+                   {
+                     if (TREE_CODE (TREE_TYPE (args)) == POINTER_TYPE
+                         && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (args)))
+                             == char_type_node))
+                       break;
+                   }
+                 if (args != 0)
+                   warning ("function might be possible candidate for `%s' format attribute",
+                            format_types[info->format_type].name);
+               }
            }
          break;
        }
index 5282938..de2e47a 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-09  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * gcc.dg/format-miss-2.c: New test.
+
 2000-12-09  Neil Booth  <neilb@earthling.net>
 
         * gcc.dg/cpp/lineflags.c: New tests.
diff --git a/gcc/testsuite/gcc.dg/format-miss-2.c b/gcc/testsuite/gcc.dg/format-miss-2.c
new file mode 100644 (file)
index 0000000..b7c5501
--- /dev/null
@@ -0,0 +1,18 @@
+/* Test for warnings for missing format attributes.  Don't warn if no
+   relevant parameters for a format attribute; see c/1017.  */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -Wformat -Wmissing-format-attribute" } */
+
+#include <stdarg.h>
+
+extern int vprintf (const char *restrict, va_list);
+
+void
+foo (int i, ...)
+{
+  va_list ap;
+  va_start (ap, i);
+  vprintf ("Foo %s bar %s", ap); /* { dg-bogus "candidate" "bogus printf attribute warning" } */
+  va_end (ap);
+}