@@ -214,7 +214,7 @@ diagnostic_build_prefix (diagnostic_context *context,
"must-not-happen"
};
const char *text = _(diagnostic_kind_text[diagnostic->kind]);
- expanded_location s = expand_location (diagnostic->location);
+ expanded_location s = expand_location_to_spelling_point (diagnostic->location);
if (diagnostic->override_column)
s.column = diagnostic->override_column;
gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
@@ -266,7 +266,7 @@ diagnostic_show_locus (diagnostic_context * context,
|| diagnostic->location <= BUILTINS_LOCATION)
return;
- s = expand_location(diagnostic->location);
+ s = expand_location_to_spelling_point (diagnostic->location);
line = location_get_source_line (s);
if (line == NULL)
return;
@@ -32,16 +32,22 @@ struct line_maps *line_table;
/* Expand the source location LOC into a human readable location. If
LOC resolves to a builtin location, the file name of the readable
- location is set to the string "<built-in>". */
-
-expanded_location
-expand_location (source_location loc)
+ location is set to the string "<built-in>". If EXPANSION_POINT_P is
+ TRUE and LOC is virtual, then it is resolved to the expansion
+ point of the involved macro. Otherwise, it is resolved to the
+ spelling location of the token. */
+
+static expanded_location
+expand_location_1 (source_location loc,
+ bool expansion_point_p)
{
expanded_location xloc;
const struct line_map *map;
loc = linemap_resolve_location (line_table, loc,
- LRK_SPELLING_LOCATION, &map);
+ expansion_point_p
+ ? LRK_MACRO_EXPANSION_POINT
+ : LRK_SPELLING_LOCATION, &map);
xloc = linemap_expand_location (line_table, map, loc);
if (loc <= BUILTINS_LOCATION)
@@ -109,6 +115,30 @@ location_get_source_line(expanded_location xloc)
return buffer;
}
+/* Expand the source location LOC into a human readable location. If
+ LOC is virtual, it resolves to the expansion point of the involved
+ macro. If LOC resolves to a builtin location, the file name of the
+ readable location is set to the string "<built-in>". */
+
+expanded_location
+expand_location (source_location loc)
+{
+ return expand_location_1 (loc, /*expansion_point_p=*/true);
+}
+
+/* Expand the source location LOC into a human readable location. If
+ LOC is virtual, it resolves to the expansion location of the
+ relevant macro. If LOC resolves to a builtin location, the file
+ name of the readable location is set to the string
+ "<built-in>". */
+
+expanded_location
+expand_location_to_spelling_point (source_location loc)
+{
+ return expand_location_1 (loc, /*expansion_piont_p=*/false);
+}
+
+
#define ONE_K 1024
#define ONE_M (ONE_K * ONE_K)
@@ -39,6 +39,7 @@ extern char builtins_location_check[(BUILTINS_LOCATION
extern expanded_location expand_location (source_location);
extern const char * location_get_source_line(expanded_location xloc);
+extern expanded_location expand_location_to_spelling_point (source_location);
/* Historically GCC used location_t, while cpp used source_location.
This could be removed but it hardly seems worth the effort. */
@@ -50,6 +51,14 @@ extern location_t input_location;
#define LOCATION_LINE(LOC) ((expand_location (LOC)).line)
#define LOCATION_COLUMN(LOC)((expand_location (LOC)).column)
+#define EXPANSION_POINT_LOCATION_FILE(LOC) \
+ ((expand_location_to_expansion_point (LOC)).file)
+#define EXPANSION_POINT_LOCATION_LINE(LOC) \
+ ((expand_location_to_expansion_point (LOC)).line)
+#define EXPANSION_POINT_LOCATION_COLUMN(LOC) \
+ ((expand_location_to_expansion_point (LOC)).column)
+
+
#define input_line LOCATION_LINE (input_location)
#define input_filename LOCATION_FILE (input_location)
#define in_system_header_at(LOC) \