diagnostics: Fix macro tracking for ad-hoc locations
authorLewis Hyatt <lhyatt@gmail.com>
Tue, 1 Nov 2022 21:50:27 +0000 (17:50 -0400)
committerLewis Hyatt <lhyatt@gmail.com>
Tue, 15 Nov 2022 15:50:23 +0000 (10:50 -0500)
The result of linemap_resolve_location() can be an ad-hoc location, if that is
what was stored in a relevant macro map.  maybe_unwind_expanded_macro_loc()
did not previously handle this case, causing it to print the wrong tracking
information for an example such as the new testcase macro-trace-1.c.  Fix that
by checking for ad-hoc locations where needed.

gcc/ChangeLog:

* tree-diagnostic.cc (maybe_unwind_expanded_macro_loc): Handle ad-hoc
location in return value of linemap_resolve_location().

gcc/testsuite/ChangeLog:

* c-c++-common/cpp/macro-trace-1.c: New test.

gcc/testsuite/c-c++-common/cpp/macro-trace-1.c [new file with mode: 0644]
gcc/tree-diagnostic.cc

diff --git a/gcc/testsuite/c-c++-common/cpp/macro-trace-1.c b/gcc/testsuite/c-c++-common/cpp/macro-trace-1.c
new file mode 100644 (file)
index 0000000..34cfbb3
--- /dev/null
@@ -0,0 +1,4 @@
+/* This token is long enough to require an ad-hoc location. Make sure that
+   the macro trace still prints properly.  */
+#define X "0123456789012345678901234567689" /* { dg-error {expected .* before string constant} } */
+X /* { dg-note {in expansion of macro 'X'} } */
index 0d79fe3..5cf3a1c 100644 (file)
@@ -190,14 +190,17 @@ maybe_unwind_expanded_macro_loc (diagnostic_context *context,
         location_t l = 
           linemap_resolve_location (line_table, resolved_def_loc,
                                     LRK_SPELLING_LOCATION,  &m);
-        if (l < RESERVED_LOCATION_COUNT || LINEMAP_SYSP (m))
+       location_t l0 = l;
+       if (IS_ADHOC_LOC (l0))
+         l0 = get_location_from_adhoc_loc (line_table, l0);
+       if (l0 < RESERVED_LOCATION_COUNT || LINEMAP_SYSP (m))
           continue;
         
        /* We need to print the context of the macro definition only
           when the locus of the first displayed diagnostic (displayed
           before this trace) was inside the definition of the
           macro.  */
-        int resolved_def_loc_line = SOURCE_LINE (m, l);
+       const int resolved_def_loc_line = SOURCE_LINE (m, l0);
         if (ix == 0 && saved_location_line != resolved_def_loc_line)
           {
             diagnostic_append_note (context, resolved_def_loc,