mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 12:41:19 +08:00
diagnostics: Fix macro tracking for ad-hoc locations
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.
This commit is contained in:
parent
3037f11fb8
commit
6238cc20f0
4
gcc/testsuite/c-c++-common/cpp/macro-trace-1.c
Normal file
4
gcc/testsuite/c-c++-common/cpp/macro-trace-1.c
Normal file
@ -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'} } */
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user