substring-locations: add class format_string_diagnostic_t
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 17 Sep 2018 20:31:01 +0000 (20:31 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Mon, 17 Sep 2018 20:31:01 +0000 (20:31 +0000)
With the addition of ranges in r263564, format_warning_at_substring_n
has 10 arguments.

Reduce the number of args by bundling the shared ones into a
class format_string_diagnostic_t.

gcc/c-family/ChangeLog:
* c-format.c (format_warning_at_char): Update for introduction of
format_string_diagnostic_t.
(format_type_warning): Likewise.

gcc/ChangeLog:
* gimple-ssa-sprintf.c (fmtwarn): Update for introduction of
format_string_diagnostic_t.
(fmtwarn_n): Likewise.
* substring-locations.c
(format_string_diagnostic_t::format_string_diagnostic_t) New ctor.
(format_warning_n_va): Convert to...
(format_string_diagnostic_t::emit_warning_n_va): ...this.
(format_warning_va): Convert to...
(format_string_diagnostic_t::emit_warning_va): ...this.
(format_warning_at_substring): Convert to...
(format_string_diagnostic_t::emit_warning): ...this.
(format_warning_at_substring_n): Convert to...
(format_string_diagnostic_t::emit_warning_n): ...this.
* substring-locations.h (class format_string_diagnostic_t): New
class.
(format_warning_va): Convert to
format_string_diagnostic_t::emit_warning_va.
(format_warning_n_va): Convert to
format_string_diagnostic_t::emit_warning_n_va.
(format_warning_at_substring): Convert to
format_string_diagnostic_t::emit_warning.
(format_warning_at_substring_n): Convert to
format_string_diagnostic_t::emit_warning_n.

From-SVN: r264372

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-format.c
gcc/gimple-ssa-sprintf.c
gcc/substring-locations.c
gcc/substring-locations.h

index 017aa64..26d7be6 100644 (file)
@@ -1,3 +1,29 @@
+2018-09-17  David Malcolm  <dmalcolm@redhat.com>
+
+       * gimple-ssa-sprintf.c (fmtwarn): Update for introduction of
+       format_string_diagnostic_t.
+       (fmtwarn_n): Likewise.
+       * substring-locations.c
+       (format_string_diagnostic_t::format_string_diagnostic_t) New ctor.
+       (format_warning_n_va): Convert to...
+       (format_string_diagnostic_t::emit_warning_n_va): ...this.
+       (format_warning_va): Convert to...
+       (format_string_diagnostic_t::emit_warning_va): ...this.
+       (format_warning_at_substring): Convert to...
+       (format_string_diagnostic_t::emit_warning): ...this.
+       (format_warning_at_substring_n): Convert to...
+       (format_string_diagnostic_t::emit_warning_n): ...this.
+       * substring-locations.h (class format_string_diagnostic_t): New
+       class.
+       (format_warning_va): Convert to
+       format_string_diagnostic_t::emit_warning_va.
+       (format_warning_n_va): Convert to
+       format_string_diagnostic_t::emit_warning_n_va.
+       (format_warning_at_substring): Convert to
+       format_string_diagnostic_t::emit_warning.
+       (format_warning_at_substring_n): Convert to
+       format_string_diagnostic_t::emit_warning_n.
+
 2018-09-17  Cesar Philippidis  <cesar@codesourcery.com>
            Bernd Schmidt <bernds_cb1@t-online.de>
 
index b299ad2..b70d77a 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-17  David Malcolm  <dmalcolm@redhat.com>
+
+       * c-format.c (format_warning_at_char): Update for introduction of
+       format_string_diagnostic_t.
+       (format_type_warning): Likewise.
+
 2018-09-17  Martin Jambor  <mjambor@suse.cz>
 
        PR c/63886
index 98c49cf..a7edfca 100644 (file)
@@ -100,8 +100,9 @@ format_warning_at_char (location_t fmt_string_loc, tree format_string_cst,
 
   substring_loc fmt_loc (fmt_string_loc, string_type, char_idx, char_idx,
                         char_idx);
-  bool warned = format_warning_va (fmt_loc, NULL, UNKNOWN_LOCATION, NULL,
-                                  NULL, opt, gmsgid, &ap);
+  format_string_diagnostic_t diag (fmt_loc, NULL, UNKNOWN_LOCATION, NULL,
+                                  NULL);
+  bool warned = diag.emit_warning_va (opt, gmsgid, &ap);
   va_end (ap);
 
   return warned;
@@ -3694,13 +3695,13 @@ format_type_warning (const substring_loc &whole_fmt_loc,
   char *corrected_substring
     = get_corrected_substring (fmt_loc, type, arg_type, fki,
                               offset_to_type_start, conversion_char);
-
+  format_string_diagnostic_t diag (fmt_loc, &fmt_label, param_loc, &param_label,
+                                  corrected_substring);
   if (wanted_type_name)
     {
       if (arg_type)
-       format_warning_at_substring
-         (fmt_loc, &fmt_label, param_loc, &param_label,
-          corrected_substring, OPT_Wformat_,
+       diag.emit_warning
+         (OPT_Wformat_,
           "%s %<%s%.*s%> expects argument of type %<%s%s%>, "
           "but argument %d has type %qT",
           gettext (kind_descriptions[kind]),
@@ -3708,9 +3709,8 @@ format_type_warning (const substring_loc &whole_fmt_loc,
           format_length, format_start,
           wanted_type_name, p, arg_num, arg_type);
       else
-       format_warning_at_substring
-         (fmt_loc, &fmt_label, param_loc, &param_label,
-          corrected_substring, OPT_Wformat_,
+       diag.emit_warning
+         (OPT_Wformat_,
           "%s %<%s%.*s%> expects a matching %<%s%s%> argument",
           gettext (kind_descriptions[kind]),
           (kind == CF_KIND_FORMAT ? "%" : ""),
@@ -3719,9 +3719,8 @@ format_type_warning (const substring_loc &whole_fmt_loc,
   else
     {
       if (arg_type)
-       format_warning_at_substring
-         (fmt_loc, &fmt_label, param_loc, &param_label,
-          corrected_substring, OPT_Wformat_,
+       diag.emit_warning
+         (OPT_Wformat_,
           "%s %<%s%.*s%> expects argument of type %<%T%s%>, "
           "but argument %d has type %qT",
           gettext (kind_descriptions[kind]),
@@ -3729,9 +3728,8 @@ format_type_warning (const substring_loc &whole_fmt_loc,
           format_length, format_start,
           wanted_type, p, arg_num, arg_type);
       else
-       format_warning_at_substring
-         (fmt_loc, &fmt_label, param_loc, &param_label,
-          corrected_substring, OPT_Wformat_,
+       diag.emit_warning
+         (OPT_Wformat_,
           "%s %<%s%.*s%> expects a matching %<%T%s%> argument",
           gettext (kind_descriptions[kind]),
           (kind == CF_KIND_FORMAT ? "%" : ""),
index 9f3eebc..9b6f6e6 100644 (file)
@@ -455,7 +455,8 @@ get_format_string (tree format, location_t *ploc)
 }
 
 /* For convenience and brevity, shorter named entrypoints of
-   format_warning_at_substring and format_warning_at_substring_n.
+   format_string_diagnostic_t::emit_warning_va and
+   format_string_diagnostic_t::emit_warning_n_va.
    These have to be functions with the attribute so that exgettext
    works properly.  */
 
@@ -464,10 +465,11 @@ ATTRIBUTE_GCC_DIAG (5, 6)
 fmtwarn (const substring_loc &fmt_loc, location_t param_loc,
         const char *corrected_substring, int opt, const char *gmsgid, ...)
 {
+  format_string_diagnostic_t diag (fmt_loc, NULL, param_loc, NULL,
+                                  corrected_substring);
   va_list ap;
   va_start (ap, gmsgid);
-  bool warned = format_warning_va (fmt_loc, NULL, param_loc, NULL,
-                                  corrected_substring, opt, gmsgid, &ap);
+  bool warned = diag.emit_warning_va (opt, gmsgid, &ap);
   va_end (ap);
 
   return warned;
@@ -479,12 +481,12 @@ fmtwarn_n (const substring_loc &fmt_loc, location_t param_loc,
           const char *corrected_substring, int opt, unsigned HOST_WIDE_INT n,
           const char *singular_gmsgid, const char *plural_gmsgid, ...)
 {
+  format_string_diagnostic_t diag (fmt_loc, NULL, param_loc, NULL,
+                                  corrected_substring);
   va_list ap;
   va_start (ap, plural_gmsgid);
-  bool warned = format_warning_n_va (fmt_loc, NULL, param_loc, NULL,
-                                    corrected_substring,
-                                    opt, n, singular_gmsgid, plural_gmsgid,
-                                    &ap);
+  bool warned = diag.emit_warning_n_va (opt, n, singular_gmsgid, plural_gmsgid,
+                                       &ap);
   va_end (ap);
 
   return warned;
index faf7884..db88f20 100644 (file)
@@ -28,12 +28,10 @@ along with GCC; see the file COPYING3.  If not see
 #include "substring-locations.h"
 #include "gcc-rich-location.h"
 
-/* Emit a warning governed by option OPT, using SINGULAR_GMSGID as the
-   format string (or if PLURAL_GMSGID is different from SINGULAR_GMSGID,
-   using SINGULAR_GMSGID, PLURAL_GMSGID and N as arguments to ngettext)
-   and AP as its arguments.
+/* format_string_diagnostic_t's ctor, giving information for use by
+   the emit_warning* member functions, as follows:
 
-   Attempt to obtain precise location information within a string
+   They attempt to obtain precise location information within a string
    literal from FMT_LOC.
 
    Case 1: if substring location is available, and is within the range of
@@ -49,7 +47,7 @@ along with GCC; see the file COPYING3.  If not see
 
    Case 2: if the substring location is available, but is not within
    the range of the format string, the primary location is that of the
-   format string, and an note is emitted showing the substring location.
+   format string, and a note is emitted showing the substring location.
 
    For example:
      test.c:90:10: warning: problem with '%i' here [-Wformat=]
@@ -120,29 +118,47 @@ along with GCC; see the file COPYING3.  If not see
                     ~^
                     %s
 
+*/
+
+format_string_diagnostic_t::
+format_string_diagnostic_t (const substring_loc &fmt_loc,
+                           const range_label *fmt_label,
+                           location_t param_loc,
+                           const range_label *param_label,
+                           const char *corrected_substring)
+: m_fmt_loc (fmt_loc),
+  m_fmt_label (fmt_label),
+  m_param_loc (param_loc),
+  m_param_label (param_label),
+  m_corrected_substring (corrected_substring)
+{
+}
+
+/* Emit a warning governed by option OPT, using SINGULAR_GMSGID as the
+   format string (or if PLURAL_GMSGID is different from SINGULAR_GMSGID,
+   using SINGULAR_GMSGID, PLURAL_GMSGID and N as arguments to ngettext)
+   and AP as its arguments.
+
    Return true if a warning was emitted, false otherwise.  */
 
 bool
-format_warning_n_va (const substring_loc &fmt_loc,
-                    const range_label *fmt_label,
-                    location_t param_loc,
-                    const range_label *param_label,
-                    const char *corrected_substring,
-                    int opt, unsigned HOST_WIDE_INT n,
-                    const char *singular_gmsgid,
-                    const char *plural_gmsgid, va_list *ap)
+format_string_diagnostic_t::emit_warning_n_va (int opt,
+                                              unsigned HOST_WIDE_INT n,
+                                              const char *singular_gmsgid,
+                                              const char *plural_gmsgid,
+                                              va_list *ap) const
 {
   bool substring_within_range = false;
   location_t primary_loc;
   location_t fmt_substring_loc = UNKNOWN_LOCATION;
   source_range fmt_loc_range
-    = get_range_from_loc (line_table, fmt_loc.get_fmt_string_loc ());
-  const char *err = fmt_loc.get_location (&fmt_substring_loc);
+    = get_range_from_loc (line_table, m_fmt_loc.get_fmt_string_loc ());
+  const char *err = m_fmt_loc.get_location (&fmt_substring_loc);
   source_range fmt_substring_range
     = get_range_from_loc (line_table, fmt_substring_loc);
   if (err)
     /* Case 3: unable to get substring location.  */
-    primary_loc = fmt_loc.get_fmt_string_loc ();
+    primary_loc = m_fmt_loc.get_fmt_string_loc ();
   else
     {
       if (fmt_substring_range.m_start >= fmt_loc_range.m_start
@@ -158,23 +174,23 @@ format_warning_n_va (const substring_loc &fmt_loc,
        /* Case 2.  */
        {
          substring_within_range = false;
-         primary_loc = fmt_loc.get_fmt_string_loc ();
+         primary_loc = m_fmt_loc.get_fmt_string_loc ();
        }
     }
 
   /* Only use fmt_label in the initial warning for case 1.  */
   const range_label *primary_label = NULL;
   if (substring_within_range)
-    primary_label = fmt_label;
+    primary_label = m_fmt_label;
 
   auto_diagnostic_group d;
   gcc_rich_location richloc (primary_loc, primary_label);
 
-  if (param_loc != UNKNOWN_LOCATION)
-    richloc.add_range (param_loc, SHOW_RANGE_WITHOUT_CARET, param_label);
+  if (m_param_loc != UNKNOWN_LOCATION)
+    richloc.add_range (m_param_loc, SHOW_RANGE_WITHOUT_CARET, m_param_label);
 
-  if (!err && corrected_substring && substring_within_range)
-    richloc.add_fixit_replace (fmt_substring_range, corrected_substring);
+  if (!err && m_corrected_substring && substring_within_range)
+    richloc.add_fixit_replace (fmt_substring_range, m_corrected_substring);
 
   diagnostic_info diagnostic;
   if (singular_gmsgid != plural_gmsgid)
@@ -205,10 +221,10 @@ format_warning_n_va (const substring_loc &fmt_loc,
       {
        /* Use fmt_label in the note for case 2.  */
        rich_location substring_richloc (line_table, fmt_substring_loc,
-                                        fmt_label);
-       if (corrected_substring)
+                                        m_fmt_label);
+       if (m_corrected_substring)
          substring_richloc.add_fixit_replace (fmt_substring_range,
-                                              corrected_substring);
+                                              m_corrected_substring);
        inform (&substring_richloc,
                "format string is defined here");
       }
@@ -219,55 +235,38 @@ format_warning_n_va (const substring_loc &fmt_loc,
 /* Singular-only version of the above.  */
 
 bool
-format_warning_va (const substring_loc &fmt_loc,
-                  const range_label *fmt_label,
-                  location_t param_loc,
-                  const range_label *param_label,
-                  const char *corrected_substring,
-                  int opt, const char *gmsgid, va_list *ap)
+format_string_diagnostic_t::emit_warning_va (int opt, const char *gmsgid,
+                                            va_list *ap) const
 {
-  return format_warning_n_va (fmt_loc, fmt_label, param_loc, param_label,
-                             corrected_substring, opt,
-                             0, gmsgid, gmsgid, ap);
+  return emit_warning_n_va (opt, 0, gmsgid, gmsgid, ap);
 }
 
-/* Variadic call to format_warning_va.  */
+/* Variadic version of the above (singular only).  */
 
 bool
-format_warning_at_substring (const substring_loc &fmt_loc,
-                            const range_label *fmt_label,
-                            location_t param_loc,
-                            const range_label *param_label,
-                            const char *corrected_substring,
-                            int opt, const char *gmsgid, ...)
+format_string_diagnostic_t::emit_warning (int opt, const char *gmsgid,
+                                         ...) const
 {
   va_list ap;
   va_start (ap, gmsgid);
-  bool warned = format_warning_va (fmt_loc, fmt_label, param_loc, param_label,
-                                  corrected_substring, opt, gmsgid, &ap);
+  bool warned = emit_warning_va (opt, gmsgid, &ap);
   va_end (ap);
 
   return warned;
 }
 
-/* Variadic call to format_warning_n_va.  */
+/* Variadic version of the above (singular vs plural).  */
 
 bool
-format_warning_at_substring_n (const substring_loc &fmt_loc,
-                              const range_label *fmt_label,
-                              location_t param_loc,
-                              const range_label *param_label,
-                              const char *corrected_substring,
-                              int opt, unsigned HOST_WIDE_INT n,
-                              const char *singular_gmsgid,
-                              const char *plural_gmsgid, ...)
+format_string_diagnostic_t::emit_warning_n (int opt, unsigned HOST_WIDE_INT n,
+                                           const char *singular_gmsgid,
+                                           const char *plural_gmsgid,
+                                           ...) const
 {
   va_list ap;
   va_start (ap, plural_gmsgid);
-  bool warned = format_warning_n_va (fmt_loc, fmt_label, param_loc, param_label,
-                                    corrected_substring,
-                                    opt, n, singular_gmsgid, plural_gmsgid,
-                                    &ap);
+  bool warned = emit_warning_n_va (opt, n, singular_gmsgid, plural_gmsgid,
+                                  &ap);
   va_end (ap);
 
   return warned;
index 919fdf0..caac537 100644 (file)
@@ -74,43 +74,43 @@ class substring_loc
   int m_end_idx;
 };
 
-/* Functions for emitting a warning about a format string.  */
-
-extern bool format_warning_va (const substring_loc &fmt_loc,
-                              const range_label *fmt_label,
-                              location_t param_loc,
-                              const range_label *param_label,
-                              const char *corrected_substring,
-                              int opt, const char *gmsgid, va_list *ap)
-  ATTRIBUTE_GCC_DIAG (7, 0);
-
-extern bool format_warning_n_va (const substring_loc &fmt_loc,
-                                const range_label *fmt_label,
-                                location_t param_loc,
-                                const range_label *param_label,
-                                const char *corrected_substring,
-                                int opt, unsigned HOST_WIDE_INT n,
-                                const char *singular_gmsgid,
-                                const char *plural_gmsgid, va_list *ap)
-  ATTRIBUTE_GCC_DIAG (8, 0) ATTRIBUTE_GCC_DIAG (9, 0);
-
-extern bool format_warning_at_substring (const substring_loc &fmt_loc,
-                                        const range_label *fmt_label,
-                                        location_t param_loc,
-                                        const range_label *param_label,
-                                        const char *corrected_substring,
-                                        int opt, const char *gmsgid, ...)
-  ATTRIBUTE_GCC_DIAG (7, 8);
-
-extern bool format_warning_at_substring_n (const substring_loc &fmt_loc,
-                                          const range_label *fmt_label,
-                                          location_t param_loc,
-                                          const range_label *param_label,
-                                          const char *corrected_substring,
-                                          int opt, unsigned HOST_WIDE_INT n,
-                                          const char *singular_gmsgid,
-                                          const char *plural_gmsgid, ...)
-  ATTRIBUTE_GCC_DIAG (8, 10) ATTRIBUTE_GCC_DIAG (9, 10);
+/* A bundle of state for emitting a diagnostic relating to a format string.  */
+
+class format_string_diagnostic_t
+{
+ public:
+  format_string_diagnostic_t (const substring_loc &fmt_loc,
+                             const range_label *fmt_label,
+                             location_t param_loc,
+                             const range_label *param_label,
+                             const char *corrected_substring);
+
+  /* Functions for emitting a warning about a format string.  */
+
+  bool emit_warning_va (int opt, const char *gmsgid, va_list *ap) const
+    ATTRIBUTE_GCC_DIAG (3, 0);
+
+  bool emit_warning_n_va (int opt, unsigned HOST_WIDE_INT n,
+                         const char *singular_gmsgid,
+                         const char *plural_gmsgid, va_list *ap) const
+  ATTRIBUTE_GCC_DIAG (4, 0) ATTRIBUTE_GCC_DIAG (5, 0);
+
+  bool emit_warning (int opt, const char *gmsgid, ...) const
+    ATTRIBUTE_GCC_DIAG (3, 4);
+
+  bool emit_warning_n (int opt, unsigned HOST_WIDE_INT n,
+                      const char *singular_gmsgid,
+                      const char *plural_gmsgid, ...) const
+  ATTRIBUTE_GCC_DIAG (4, 6) ATTRIBUTE_GCC_DIAG (5, 6);
+
+ private:
+  const substring_loc &m_fmt_loc;
+  const range_label *m_fmt_label;
+  location_t m_param_loc;
+  const range_label *m_param_label;
+  const char *m_corrected_substring;
+};
+
 
 /* Implementation detail, for use when implementing
    LANG_HOOKS_GET_SUBSTRING_LOCATION.  */