re PR c++/64629 (-Wformat-security warns with const char *const vars)
authorJason Merrill <jason@redhat.com>
Wed, 21 Jan 2015 20:15:27 +0000 (15:15 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 21 Jan 2015 20:15:27 +0000 (15:15 -0500)
PR c++/64629
* c-format.c (check_format_arg): Call decl_constant_value.

From-SVN: r219964

gcc/c-family/ChangeLog
gcc/c-family/c-format.c
gcc/testsuite/g++.dg/warn/Wformat-1.C [new file with mode: 0644]

index df56b3109921f602f600aa9bbf22b024831c1851..3b9a3d4b5cba3e82df12da2014cf0d25633f1f3a 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-21  Jason Merrill  <jason@redhat.com>
+
+       PR c++/64629
+       * c-format.c (check_format_arg): Call decl_constant_value.
+
 2015-01-19  Martin Liska  <mliska@suse.cz>
 
        * c-common.c (handle_noicf_attribute): New function.
index e47c190ce53544dbc2e82128f0e12783cb740128..faaca093070f6d0705883aa76ce718e30de33a93 100644 (file)
@@ -1443,6 +1443,13 @@ check_format_arg (void *ctx, tree format_tree,
   tree array_init;
   alloc_pool fwt_pool;
 
+  if (TREE_CODE (format_tree) == VAR_DECL)
+    {
+      /* Pull out a constant value if the front end didn't.  */
+      format_tree = decl_constant_value (format_tree);
+      STRIP_NOPS (format_tree);
+    }
+
   if (integer_zerop (format_tree))
     {
       /* Skip to first argument to check, so we can see if this format
diff --git a/gcc/testsuite/g++.dg/warn/Wformat-1.C b/gcc/testsuite/g++.dg/warn/Wformat-1.C
new file mode 100644 (file)
index 0000000..6094a9c
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/64629
+// { dg-options "-Wformat -Wformat-security" }
+
+extern void bar (int, const char *, ...) __attribute__((format (printf, 2, 3)));
+void
+foo (void)
+{
+  const char *const msg = "abc";
+  bar (1, msg);
+}