Fix missing range information for "%q+D" format code
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 7 Dec 2015 16:07:00 +0000 (16:07 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Mon, 7 Dec 2015 16:07:00 +0000 (16:07 +0000)
gcc/c-family/ChangeLog:
* c-common.c (c_cpp_error): Update for change to
rich_location::set_range.

gcc/fortran/ChangeLog:
* error.c (gfc_format_decoder): Update for change of
text_info::set_range to text_info::set_location.

gcc/ChangeLog:
* pretty-print.c (text_info::set_range): Rename to...
(text_info::set_location): ...this, converting 2nd param
from source_range to a location_t.
* pretty-print.h (text_info::set_location): Convert
from inline function to external definition.
(text_info::set_range): Delete.

gcc/testsuite/ChangeLog:
* gcc.dg/diagnostic-ranges-1.c: New test file.
* gcc.dg/plugin/diagnostic-test-show-locus-bw.c
(test_percent_q_plus_d): New test function.
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
(test_show_locus): Rewrite test code using
rich_location::set_range.  Add code to unit-test the "%q+D"
format code.

libcpp/ChangeLog:
* include/line-map.h (rich_location::set_range): Add line_maps *
param; convert param from source_range to source_location.  Drop
"overwrite_loc_p" param.
* line-map.c (rich_location::set_range): Likewise, acting as if
"overwrite_loc_p" were true, and getting range from the location.

From-SVN: r231367

14 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/fortran/ChangeLog
gcc/fortran/error.c
gcc/pretty-print.c
gcc/pretty-print.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/diagnostic-ranges-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c
gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
libcpp/ChangeLog
libcpp/include/line-map.h
libcpp/line-map.c

index 62a601c6ee6b878c2499ef10fa790d18996ee425..80e848123c9ddc3d3d92302d155637488ffd45ad 100644 (file)
@@ -1,3 +1,12 @@
+2015-12-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * pretty-print.c (text_info::set_range): Rename to...
+       (text_info::set_location): ...this, converting 2nd param
+       from source_range to a location_t.
+       * pretty-print.h (text_info::set_location): Convert
+       from inline function to external definition.
+       (text_info::set_range): Delete.
+
 2015-12-07  Nathan Sidwell  <nathan@acm.org>
 
        * config/nvptx/nvptx.c (nvptx_assemble_decl_begin): Look inside
index 4668ce624b986c4fbe99d756eac499ef0a583556..03a66eb22126eccc790b951e477e25b6852b5677 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * c-common.c (c_cpp_error): Update for change to
+       rich_location::set_range.
+
 2015-12-04  Paolo Bonzini  <bonzini@gnu.org>
 
        * c-common.c (maybe_warn_shift_overflow): Warn on all overflows if
index f89deb32889f649a9554a8676fe6c2599e59cbf0..9bc02fcf85c5a4e74ef69276d38dd6f704dd2c78 100644 (file)
@@ -10161,9 +10161,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
       gcc_unreachable ();
     }
   if (done_lexing)
-    richloc->set_range (0,
-                       source_range::from_location (input_location),
-                       true, true);
+    richloc->set_range (line_table, 0, input_location, true);
   diagnostic_set_info_translated (&diagnostic, msg, ap,
                                  richloc, dlevel);
   diagnostic_override_option_index (&diagnostic,
index ba176a1e469a958312fc7ea259911599570901bd..8e74bec408637d7450376417e6a1ea60e07e4af4 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * error.c (gfc_format_decoder): Update for change of
+       text_info::set_range to text_info::set_location.
+
 2015-12-05  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/68676
index b4f70203078ca571bb0f329cbdf9bc8e7c05e0b9..8f57affe653cd41e5053ea633cdc3ad2662dda89 100644 (file)
@@ -939,12 +939,11 @@ gfc_format_decoder (pretty_printer *pp,
        /* If location[0] != UNKNOWN_LOCATION means that we already
           processed one of %C/%L.  */
        int loc_num = text->get_location (0) == UNKNOWN_LOCATION ? 0 : 1;
-       source_range range
-         = source_range::from_location (
-             linemap_position_for_loc_and_offset (line_table,
-                                                  loc->lb->location,
-                                                  offset));
-       text->set_range (loc_num, range, true);
+       location_t src_loc
+         = linemap_position_for_loc_and_offset (line_table,
+                                                loc->lb->location,
+                                                offset);
+       text->set_location (loc_num, src_loc, true);
        pp_string (pp, result[loc_num]);
        return true;
       }
index 4a28d3c5fd9e683aa4faa60b098b2e09db48e27f..33650746ae962f39c70277b4068bf6108c5df5aa 100644 (file)
@@ -31,14 +31,14 @@ along with GCC; see the file COPYING3.  If not see
 #include <iconv.h>
 #endif
 
-/* Overwrite the range within this text_info's rich_location.
+/* Overwrite the given location/range within this text_info's rich_location.
    For use e.g. when implementing "+" in client format decoders.  */
 
 void
-text_info::set_range (unsigned int idx, source_range range, bool caret_p)
+text_info::set_location (unsigned int idx, location_t loc, bool show_caret_p)
 {
   gcc_checking_assert (m_richloc);
-  m_richloc->set_range (idx, range, caret_p, true);
+  m_richloc->set_range (line_table, idx, loc, show_caret_p);
 }
 
 location_t
index cdee2535fe0f024ae4fd87607bf578907def5570..3dc1f6b43aa44b4e1adb11b35ddcb22205e74774 100644 (file)
@@ -37,14 +37,7 @@ struct text_info
   void **x_data;
   rich_location *m_richloc;
 
-  inline void set_location (unsigned int idx, location_t loc, bool caret_p)
-  {
-    source_range src_range;
-    src_range.m_start = loc;
-    src_range.m_finish = loc;
-    set_range (idx, src_range, caret_p);
-  }
-  void set_range (unsigned int idx, source_range range, bool caret_p);
+  void set_location (unsigned int idx, location_t loc, bool caret_p);
   location_t get_location (unsigned int index_of_location) const;
 };
 
index 46b79e057fbd88a2ef5875e8273c985f49f99a7a..93f3af2a201f777c943a0b7c5b1930b28da4ca9d 100644 (file)
@@ -1,3 +1,13 @@
+2015-12-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * gcc.dg/diagnostic-ranges-1.c: New test file.
+       * gcc.dg/plugin/diagnostic-test-show-locus-bw.c
+       (test_percent_q_plus_d): New test function.
+       * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
+       (test_show_locus): Rewrite test code using
+       rich_location::set_range.  Add code to unit-test the "%q+D"
+       format code.
+
 2015-12-07  Martin Liska  <mliska@suse.cz>
 
        * g++.dg/ipa/pr66896.C: New test.
diff --git a/gcc/testsuite/gcc.dg/diagnostic-ranges-1.c b/gcc/testsuite/gcc.dg/diagnostic-ranges-1.c
new file mode 100644 (file)
index 0000000..369c0b3
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fdiagnostics-show-caret -Wall" } */
+
+void test_range_of_unused_variable (void)
+{
+  int redundant; /* { dg-warning "unused variable" } */
+/* { dg-begin-multiline-output "" }
+   int redundant;
+       ^~~~~~~~~
+   { dg-end-multiline-output "" } */
+}
index 44b47e0f38b33de39c96c6106ad0a7e6ab1a88ce..8d44078a29dea2cc167a417ebb57916de5c34a36 100644 (file)
@@ -190,3 +190,15 @@ void test_fixit_replace (void)
    { dg-end-multiline-output "" } */
 #endif
 }
+
+/* Test of "%q+D" format code.  */
+
+int test_percent_q_plus_d (void)
+{
+  int local = 0; /* { dg-warning "example of plus in format code" } */
+/* { dg-begin-multiline-output "" }
+   int local = 0;
+       ^~~~~
+   { dg-end-multiline-output "" } */
+  return local;
+}
index 7ff2cff79eeab63ee28ce6726908603bc293d891..02a2aef3d4ce1aeedb67c07d5976b967e4b3b329 100644 (file)
@@ -224,9 +224,11 @@ test_show_locus (function *fun)
       source_range src_range;
       src_range.m_start = get_loc (line, 12);
       src_range.m_finish = get_loc (line, 20);
-      rich_location richloc (line_table, caret);
-      richloc.set_range (0, src_range, true, false);
-      warning_at_rich_loc (&richloc, 0, "test");
+      location_t combined_loc = COMBINE_LOCATION_DATA (line_table,
+                                                      caret,
+                                                      src_range,
+                                                      NULL);
+      warning_at (combined_loc, 0, "test");
     }
 
   /* Example of a very wide line, where the information of interest
@@ -238,9 +240,11 @@ test_show_locus (function *fun)
       source_range src_range;
       src_range.m_start = get_loc (line, 90);
       src_range.m_finish = get_loc (line, 98);
-      rich_location richloc (line_table, caret);
-      richloc.set_range (0, src_range, true, false);
-      warning_at_rich_loc (&richloc, 0, "test");
+      location_t combined_loc = COMBINE_LOCATION_DATA (line_table,
+                                                      caret,
+                                                      src_range,
+                                                      NULL);
+      warning_at (combined_loc, 0, "test");
     }
 
   /* Example of multiple carets.  */
@@ -313,6 +317,17 @@ test_show_locus (function *fun)
       global_dc->caret_chars[0] = '^';
       global_dc->caret_chars[1] = '^';
     }
+
+  /* Example of using the "%q+D" format code, which as well as printing
+     a quoted decl, overrides the given location to use the location of
+     the decl.  */
+  if (0 == strcmp (fnname, "test_percent_q_plus_d"))
+    {
+      const int line = fnstart_line + 3;
+      tree local = (*fun->local_decls)[0];
+      warning_at (input_location, 0,
+                 "example of plus in format code for %q+D", local);
+    }
 }
 
 unsigned int
index 78a0d7cb373ed502b0919b476743592eb21c5e3e..9b296fd836a3ad9be36f5bc0d32bf7bcbc52de77 100644 (file)
@@ -1,3 +1,11 @@
+2015-12-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * include/line-map.h (rich_location::set_range): Add line_maps *
+       param; convert param from source_range to source_location.  Drop
+       "overwrite_loc_p" param.
+       * line-map.c (rich_location::set_range): Likewise, acting as if
+       "overwrite_loc_p" were true, and getting range from the location.
+
 2015-11-20  David Malcolm  <dmalcolm@redhat.com>
 
        PR 62314
index 4f440fa5e51887af5a8e854fdda1c79aff0b16ea..73c583e6160d24af79c4e2ab5a28861ca5e928b7 100644 (file)
@@ -1376,8 +1376,8 @@ class rich_location
   add_range (location_range *src_range);
 
   void
-  set_range (unsigned int idx, source_range src_range,
-            bool show_caret_p, bool overwrite_loc_p);
+  set_range (line_maps *set, unsigned int idx, source_location loc,
+            bool show_caret_p);
 
   unsigned int get_num_locations () const { return m_num_ranges; }
 
index 42843038e3bf2c89fa25f78647f269a8f7c94999..209d0fbe656c22a639ae2bc5292d21b51ae9316d 100644 (file)
@@ -2064,23 +2064,22 @@ rich_location::add_range (location_range *src_range)
   m_ranges[m_num_ranges++] = *src_range;
 }
 
-/* Add or overwrite the range given by IDX.  It must either
-   overwrite an existing range, or add one *exactly* on the end of
-   the array.
+/* Add or overwrite the location given by IDX, setting its location to LOC,
+   and setting its "should my caret be printed" flag to SHOW_CARET_P.
 
-   This is primarily for use by gcc when implementing diagnostic
-   format decoders e.g. the "+" in the C/C++ frontends, for handling
-   format codes like "%q+D" (which writes the source location of a
-   tree back into range 0 of the rich_location).
+   It must either overwrite an existing location, or add one *exactly* on
+   the end of the array.
 
-   If SHOW_CARET_P is true, then the range should be rendered with
-   a caret at its starting location.  This
-   is for use by the Fortran frontend, for implementing the
-   "%C" and "%L" format codes.  */
+   This is primarily for use by gcc when implementing diagnostic format
+   decoders e.g.
+   - the "+" in the C/C++ frontends, for handling format codes like "%q+D"
+     (which writes the source location of a tree back into location 0 of
+     the rich_location), and
+   - the "%C" and "%L" format codes in the Fortran frontend.  */
 
 void
-rich_location::set_range (unsigned int idx, source_range src_range,
-                         bool show_caret_p, bool overwrite_loc_p)
+rich_location::set_range (line_maps *set, unsigned int idx,
+                         source_location loc, bool show_caret_p)
 {
   linemap_assert (idx < MAX_RANGES);
 
@@ -2088,6 +2087,8 @@ rich_location::set_range (unsigned int idx, source_range src_range,
      on the end of the array.  */
   linemap_assert (idx <= m_num_ranges);
 
+  source_range src_range = get_range_from_loc (set, loc);
+
   location_range *locrange = &m_ranges[idx];
   locrange->m_start
     = linemap_client_expand_location_to_spelling_point (src_range.m_start);
@@ -2095,16 +2096,16 @@ rich_location::set_range (unsigned int idx, source_range src_range,
     = linemap_client_expand_location_to_spelling_point (src_range.m_finish);
 
   locrange->m_show_caret_p = show_caret_p;
-  if (overwrite_loc_p)
-    locrange->m_caret = locrange->m_start;
+  locrange->m_caret
+    = linemap_client_expand_location_to_spelling_point (loc);
 
   /* Are we adding a range onto the end?  */
   if (idx == m_num_ranges)
     m_num_ranges = idx + 1;
 
-  if (idx == 0 && overwrite_loc_p)
+  if (idx == 0)
     {
-      m_loc = src_range.m_start;
+      m_loc = loc;
       /* Mark any cached value here as dirty.  */
       m_have_expanded_location = false;
     }