summaryrefslogtreecommitdiff
path: root/gcc/c-family
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2018-04-30 15:01:56 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-04-30 15:01:56 +0000
commit7761dfbee17cb7a4bb3539a381bec63d31af7c28 (patch)
treee583063e82b23bf43e882069fe4de7790d5e078d /gcc/c-family
parentb6e33d73d8aa1b7965d6b2bf08b5bbd673e63284 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/c-family/c-format.c10
-rw-r--r--gcc/c-family/c-indentation.c9
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];