diff options
Diffstat (limited to 'libcpp/line-map.c')
-rw-r--r-- | libcpp/line-map.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 8a368ee..e6a344f 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -755,13 +755,35 @@ linemap_location_in_system_header_p (struct line_maps *set, { const struct line_map *map = NULL; - location = - linemap_resolve_location (set, location, LRK_SPELLING_LOCATION, &map); - if (location < RESERVED_LOCATION_COUNT) return false; - return LINEMAP_SYSP (map); + /* Let's look at where the token for LOCATION comes from. */ + while (true) + { + map = linemap_lookup (set, location); + if (map != NULL) + { + if (!linemap_macro_expansion_map_p (map)) + /* It's a normal token. */ + return LINEMAP_SYSP (map); + else + { + /* It's a token resulting from a macro expansion. */ + source_location loc = + linemap_macro_map_loc_unwind_toward_spelling (map, location); + if (loc < RESERVED_LOCATION_COUNT) + /* This token might come from a built-in macro. Let's + look at where that macro got expanded. */ + location = linemap_macro_map_loc_to_exp_point (map, location); + else + location = loc; + } + } + else + break; + } + return false; } /* Return TRUE if LOCATION is a source code location of a token coming |