diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-04-30 15:01:56 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-04-30 15:01:56 +0000 |
commit | 7761dfbee17cb7a4bb3539a381bec63d31af7c28 (patch) | |
tree | e583063e82b23bf43e882069fe4de7790d5e078d /gcc/c-family | |
parent | b6e33d73d8aa1b7965d6b2bf08b5bbd673e63284 (diff) | |
download | gcc-7761dfbee17cb7a4bb3539a381bec63d31af7c28.tar.gz |
Use char_span for return type of location_get_source_line
location_get_source_line returns a const char * that isn't 0-terminated,
writing back a length through an int * param.
This is error-prone, as all call-sites have to take into account the
lack of 0-termination, and respect the length of the buffer.
It's cleaner to bundle together this pointer+length state into a class,
so this patch does so, reusing the "char_span" class that I introduced
in r250187 (as part of the fix for PR c/81405).
The patch also adds assertions to all access to the char_span.
gcc/c-family/ChangeLog:
* c-format.c (get_corrected_substring): Update for
location_get_source_line returning a char_span. Use a char_span
when handling the prefix of the correction.
* c-indentation.c (get_visual_column): Update for
location_get_source_line returning a char_span.
(get_first_nws_vis_column): Likewise.
gcc/ChangeLog:
* diagnostic-show-locus.c (layout::layout): Update for
location_get_source_line returning a char_span.
(struct char_span): Move to input.h.
(struct correction): Update for fields in char_span becoming
private.
(struct source_line): Update for location_get_source_line
returning a char_span.
(layout::print_line): Likewise.
* edit-context.c (edited_file::print_content): Likewise.
(edited_file::print_diff_hunk): Likewise.
(edited_file::print_run_of_changed_lines): Likewise.
(edited_file::get_num_lines): Likewise.
(edited_line::edited_line): Likewise.
* final.c (asm_show_source): Likewise.
* input.c (location_get_source_line): Convert return type
from const char * to char_span, losing the final "line_len"
param.
(dump_location_info): Update for the above.
(get_substring_ranges_for_loc): Likewise. Use a char_span
when handling the literal within the line.
(test_reading_source_line): Update for location_get_source_line
returning a char_span.
* input.h (class char_span): Move here from
diagnostic-show-locus.c, converting from a struct to a class.
Make data members private.
(char_span::operator bool): New.
(char_span::length): New.
(char_span::get_buffer): New.
(char_span::operator[]): New.
(char_span::subspan): Make const.
(char_span::xstrdup): New.
(location_get_source_line): Convert return type from const char *
to char_span, losing the final "line_size" param.
gcc/testsuite/ChangeLog:
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
(test_show_locus): Update for location_get_source_line returning a
char_span. Use char_span for handling words in the
"test_many_nested_locations" fix-it example.
From-SVN: r259768
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-family/c-format.c | 10 | ||||
-rw-r--r-- | gcc/c-family/c-indentation.c | 9 |
3 files changed, 16 insertions, 12 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 27245b7e60d..ab85a73bd1b 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,12 @@ +2018-04-30 David Malcolm <dmalcolm@redhat.com> + + * c-format.c (get_corrected_substring): Update for + location_get_source_line returning a char_span. Use a char_span + when handling the prefix of the correction. + * c-indentation.c (get_visual_column): Update for + location_get_source_line returning a char_span. + (get_first_nws_vis_column): Likewise. + 2018-03-29 David Malcolm <dmalcolm@redhat.com> PR c++/84269 diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c index 3f4f83af219..ee7c33d97f2 100644 --- a/gcc/c-family/c-format.c +++ b/gcc/c-family/c-format.c @@ -3499,10 +3499,8 @@ get_corrected_substring (const substring_loc &fmt_loc, if (caret.column > finish.column) return NULL; - int line_width; - const char *line = location_get_source_line (start.file, start.line, - &line_width); - if (line == NULL) + char_span line = location_get_source_line (start.file, start.line); + if (!line) return NULL; /* If we got this far, then we have the line containing the @@ -3511,9 +3509,9 @@ get_corrected_substring (const substring_loc &fmt_loc, Generate a trimmed copy, containing the prefix part of the conversion specification, up to the (but not including) the length modifier. In the above example, this would be "%-+*.*". */ - const char *current_content = line + start.column - 1; int length_up_to_type = caret.column - start.column; - char *prefix = xstrndup (current_content, length_up_to_type); + char_span prefix_span = line.subspan (start.column - 1, length_up_to_type); + char *prefix = prefix_span.xstrdup (); /* Now attempt to generate a suggestion for the rest of the specification (length modifier and conversion char), based on ARG_TYPE and diff --git a/gcc/c-family/c-indentation.c b/gcc/c-family/c-indentation.c index acca44472e8..44b1e1e361f 100644 --- a/gcc/c-family/c-indentation.c +++ b/gcc/c-family/c-indentation.c @@ -70,9 +70,7 @@ get_visual_column (expanded_location exploc, location_t loc, return false; } - int line_len; - const char *line = location_get_source_line (exploc.file, exploc.line, - &line_len); + char_span line = location_get_source_line (exploc.file, exploc.line); if (!line) return false; unsigned int vis_column = 0; @@ -112,12 +110,11 @@ get_first_nws_vis_column (const char *file, int line_num, { gcc_assert (first_nws); - int line_len; - const char *line = location_get_source_line (file, line_num, &line_len); + char_span line = location_get_source_line (file, line_num); if (!line) return false; unsigned int vis_column = 0; - for (int i = 1; i < line_len; i++) + for (size_t i = 1; i < line.length (); i++) { unsigned char ch = line[i - 1]; |