1. 21 Mar, 2017 1 commit
  2. 16 Mar, 2017 1 commit
  3. 09 Feb, 2017 1 commit
  4. 31 Jan, 2017 1 commit
  5. 27 Jan, 2017 1 commit
  6. 23 Jan, 2017 1 commit
  7. 10 Jan, 2017 2 commits
    • Fix issues with unrepresentable column numbers (PR c++/77949) · b9f4757f
      PR c++/77949 identifies an ICE when the C++ frontend attempts to emit a
      fix-it hint inserting a missing semicolon at column 4097 of a source file.
      
      This column value exceeds LINE_MAP_MAX_COLUMN_NUMBER and hence isn't
      representable using a location_t.
      
      Attempting to do so leads to these problems, which this patch fixes:
      
      (a) when encountering a column number > LINE_MAP_MAX_COLUMN_NUMBER we
      create a new linemap with m_column_and_range_bits == 0, but
      linemap_position_for_column doesn't check for this, and hence can emit
      a bogus location_t value that's calculated relative to the previous
      linemap start, but which will be decoded relative to the new linemap,
      leading to very large incorrect line values.
      
      (b) when encountering a column number that can't be represented, and
      for which the linemap was pre-existing, the code would hit this assertion:
        if (linemap_assert_fails (column < (1u << map->m_column_and_range_bits)))
      around a bail-out condition.  The patch replaces this assertion with a
      simple conditional, to stop the ICE when this occurs, and fixes the
      bit count (effective column bits, vs column+range bits)
      
      (c) the C++ frontend wasn't checking for failure of
      linemap_position_for_loc_and_offset when considering emitting the fix-it
      hint.  The patch adds a conditional, so that no fix-it hint is emitted
      if the location is bogus.
      
      gcc/cp/ChangeLog:
      	PR c++/77949
      	* parser.c (cp_parser_class_specifier_1): Only suggest inserting
      	a missing semicolon if we have a valid insertion location for
      	the fix-it hint.
      
      gcc/ChangeLog:
      	PR c++/77949
      	* input.c (selftest::test_accessing_ordinary_linemaps): Verify
      	that we correctly handle column numbers greater than
      	LINE_MAP_MAX_COLUMN_NUMBER.
      
      gcc/testsuite/ChangeLog:
      	PR c++/77949
      	* g++.dg/diagnostic/pr77949.C: New test case.
      
      libcpp/ChangeLog:
      	PR c++/77949
      	* line-map.c (linemap_position_for_column): When calling
      	linemap_start_line, detect if a new linemap was created with
      	0 column bits, and bail out early if this is the case.
      	(linemap_position_for_loc_and_offset): Replace overzealous
      	linemap_assert_fails with a simple conditional; use correct
      	bit count.
      
      From-SVN: r244292
      David Malcolm committed
    • * da.po: Update. · b7cfd5c4
      From-SVN: r244288
      Joseph Myers committed
  8. 09 Jan, 2017 1 commit
  9. 07 Jan, 2017 1 commit
    • Fix linemap corruption after very wide source lines (PR c++/72803) · 5ccf1d8d
      PR c++/72803 describes an issue where a fix-it hint is to be emitted at
      column 512 of a 511-column source line, leading to an ICE.
      
      The root cause is a bug in linemap_line_start, when transitioning from
      lines >= 512 in width to narrow lines.
      
      The wide line in the reproducer has a line map with:
        m_column_and_range_bits = 15, m_range_bits = 5
      giving 10 effective bits for representing columns, so that columns <= 1023
      can be represented.
      
      When parsing the following line,
        linemap_line_start (..., ..., max_column_hint=0);
      is called.  This leads to the "add_map" logic, due to this condition:
            || (max_column_hint <= 80 && effective_column_bits >= 10)
      i.e. the new line is sufficiently narrower than the old one to
      potentially use a new linemap (so as to conserve values within the
      location_t space).
      
      It then attempts to avoid allocating a new line map.  Part of the logic
      to determine if we really need a new line map is this condition:
         SOURCE_COLUMN (map, highest) >= (1U << column_bits)
      The above condition is incorrect: we need to determine if the highest
      column we've handed out will fit within the proposed *effective* column
      bits, but "column_bits" here is the column plus the range bits, rather
      than just the column bits.
      
      Hence in this case linemap_line_start erroneously decides that we don't
      need a new line map, and updates the column bits within the existing
      line map, so any location_t values we've already handed out within it
      that are offset from the start by
        >= (1<<new_column_and_range_bits)
      effectively change meaning, leading to incorrect line&column information
      when decoding them, and various "interesting" ways for the linemap
      code to fail.
      
      The fix is to use the effective column bits in the above conditional.
      
      gcc/ChangeLog:
      	PR c++/72803
      	* input.c (selftest::test_accessing_ordinary_linemaps): Verify
      	that the transition from a max line width >= 1<<10 to narrower
      	lines works correctly.
      
      gcc/testsuite/ChangeLog:
      	PR c++/72803
      	* g++.dg/diagnostic/pr72803.C: New test case.
      
      libcpp/ChangeLog:
      	PR c++/72803
      	* line-map.c (linemap_line_start): When determining if the highest
      	column given out so far will fit into a proposed change to the
      	current map, use the effective number of column bits, rather than
      	the total number of column + range bits.
      
      From-SVN: r244199
      David Malcolm committed
  10. 05 Jan, 2017 1 commit
  11. 04 Jan, 2017 1 commit
  12. 03 Jan, 2017 1 commit
    • Update .po files from TP. · 549a66a5
      gcc/po:
      	* be.po, da.po, de.po, el.po, es.po, fi.po, fr.po, hr.po, id.po,
      	ja.po, nl.po, ru.po, sr.po, sv.po, tr.po, uk.po, vi.po, zh_CN.po,
      	zh_TW.po: Update.
      
      libcpp/po:
      	* be.po, ca.po, da.po, de.po, el.po, eo.po, es.po, fi.po, fr.po,
      	id.po, ja.po, nl.po, pr_BR.po, ru.po, sr.po, sv.po, tr.po, uk.po,
      	vi.po, zh_CN.po, zh_TW.po: Update.
      
      From-SVN: r244032
      Joseph Myers committed
  13. 01 Jan, 2017 2 commits
  14. 15 Dec, 2016 1 commit
    • Fix use-after-free lexing unterminated raw strings (PR preprocessor/78811) · a3998c2f
      gcc/ChangeLog:
      	PR preprocessor/78680
      	PR preprocessor/78811
      	* input.c (struct selftest::lexer_test): Add field
      	m_implicitly_expect_EOF.
      	(selftest::lexer_error_sink): New class.
      	(selftest::lexer_error_sink::s_singleton): New global.
      	(selftest::lexer_test::lexer_test): Initialize new field
      	"m_implicitly_expect_EOF".
      	(selftest::lexer_test::~lexer_test): Conditionalize the
      	check for the EOF token on the new field.
      	(selftest::test_lexer_string_locations_raw_string_unterminated):
      	New function.
      	(selftest::input_c_tests): Call the new test.
      
      libcpp/ChangeLog:
      	PR preprocessor/78680
      	PR preprocessor/78811
      	* lex.c (_cpp_lex_direct): Only determine the end-location of
      	the token and build a range for non-reserved start locations.
      	Do not do it for EOF tokens.
      
      From-SVN: r243721
      David Malcolm committed
  15. 12 Dec, 2016 1 commit
    • re PR preprocessor/78680 (ICE in get_substring_ranges_for_loc, at input.c:1398) · 470a60b2
      Fix for PR preprocessor/78680
      
      PR preprocessor/78680 identifies a crash when attempting to issue
      a -Wformat warning, where the format string includes a string token
      split across multiple physical source lines via backslash-continued
      lines.
      
      The issue is that libcpp is generating bogus range information for
      such tokens.
      
      For example, in:
      
      void fn1() {
        __builtin_printf("\
           %ld.\n\
              2\n"); };
      
      the range of the string token is printed as:
      
         __builtin_printf("\
                          ^~
      
      whereas the range ought to be:
      
        __builtin_printf("\
                         ^~
           %ld.\n\
           ~~~~~~~
              2\n"); };
              ~~~~
      
      The root cause is that the line notes expressing the update
      of the buffer in lex.c aren't yet updated when the end-point of
      the token is computed
      
      3095	    tok_range.m_finish
      3096	      = linemap_position_for_column (pfile->line_table,
      3097					     CPP_BUF_COLUMN (buffer, buffer->cur));
      
      so that the physical line is still regarded as that of the start
      of the token, and, where CPP_BUF_COLUMN uses (BUF)->line_base,
      line_base is still the location of the first physical line in the
      and hence the column information is too large (as if it were the
      offset in the *logical* line).
      
      (the printed range is somewhat misleading; the actual buggy range
      extends beyond the "\ in the line, but within diagnostic-show-locus.c
      layout::print_annotation_line only prints up to the xbound set by
      layout::print_source_line and so truncates most of the buggy range).
      
      The fix is to ensure that line notes are handled before calculating
      the end-point of the token range.
      
      This leads to the range for the string token being correctly
      computed, as:
      
        __builtin_printf("\
                         ^~
           %ld.\n\
           ~~~~~~~
              2\n"); };
              ~~~~
      
      and this leads to get_substring_ranges_for_loc failing gracefully,
      rather than crashing.
      
      gcc/testsuite/ChangeLog:
      	PR preprocessor/78680
      	* gcc.dg/format/pr78680.c: New test case.
      	* gcc.dg/plugin/diagnostic-test-expressions-1.c
      	(test_multiline_token): New function.
      	* gcc.dg/plugin/diagnostic-test-string-literals-1.c
      	(test_backslash_continued_logical_lines): New function.
      
      libcpp/ChangeLog:
      	PR preprocessor/78680
      	* lex.c (_cpp_lex_direct): Ensure line notes are processed before
      	computing the end-point of the token.
      
      From-SVN: r243567
      David Malcolm committed
  16. 23 Nov, 2016 1 commit
    • system.h (HAVE_DESIGNATED_INITIALIZERS, [...]): Do not use "defined" in macros. · fb2675cb
      gcc:
      2016-11-23  Paolo Bonzini  <bonzini@gnu.org>
      
      	* system.h (HAVE_DESIGNATED_INITIALIZERS,
      	HAVE_DESIGNATED_UNION_INITIALIZERS): Do not use
      	"defined" in macros.
      	* doc/cpp.texi (Defined): Mention -Wexpansion-to-defined.
      	* doc/cppopts.texi (Invocation): Document -Wexpansion-to-defined.
      	* doc/invoke.texi (Warning Options): Document -Wexpansion-to-defined.
      
      gcc/c-family:
      2016-11-23  Paolo Bonzini  <bonzini@gnu.org>
      
      	* c.opt (Wexpansion-to-defined): New.
      
      gcc/testsuite:
      2016-11-23  Paolo Bonzini  <bonzini@gnu.org>
      
      	* gcc.dg/cpp/defined.c: Mark newly introduced warnings and
      	adjust for warning->pedwarn change.
      	* gcc.dg/cpp/defined-syshdr.c,
      	gcc.dg/cpp/defined-Wexpansion-to-defined.c,
      	gcc.dg/cpp/defined-Wextra-Wno-expansion-to-defined.c,
      	gcc.dg/cpp/defined-Wextra.c,
      	gcc.dg/cpp/defined-Wno-expansion-to-defined.c: New testcases.
      
      libcpp:
      2016-11-23  Paolo Bonzini  <bonzini@gnu.org>
      
      	* include/cpplib.h (struct cpp_options): Add new member
      	warn_expansion_to_defined.
      	(CPP_W_EXPANSION_TO_DEFINED): New enum member.
      	* expr.c (parse_defined): Warn for all uses of "defined"
      	in macros, and tie warning to CPP_W_EXPANSION_TO_DEFINED.
      	Make it a pedwarning instead of a warning.
      	* system.h (HAVE_DESIGNATED_INITIALIZERS): Do not use
      	"defined" in macros.
      
      From-SVN: r242743
      Paolo Bonzini committed
  17. 17 Nov, 2016 1 commit
    • Fix locations within raw strings · b8f56412
      Whilst investigating PR preprocessor/78324 I noticed that the
      substring location code currently doesn't handle raw strings
      correctly, by not skipping the 'R', opening quote, delimiter
      and opening parenthesis.
      
      For example, an attempt to underline chars 4-7 with caret at 6 of
      this raw string yields this erroneous output:
         __emit_string_literal_range (R"foo(0123456789)foo",
                                          ~~^~
      
      With the patch, the correct range/caret is printed:
      
         __emit_string_literal_range (R"foo(0123456789)foo",
                                                ~~^~
      
      gcc/ChangeLog:
      	* input.c (selftest::test_lexer_string_locations_long_line): New
      	function.
      	(selftest::test_lexer_string_locations_raw_string_multiline): New
      	function.
      	(selftest::input_c_tests): Call the new functions, via
      	for_each_line_table_case.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/plugin/diagnostic-test-string-literals-1.c
      	(test_raw_string_one_liner): New function.
      	(test_raw_string_multiline): New function.
      
      libcpp/ChangeLog:
      	* charset.c (cpp_interpret_string_1): Skip locations from
      	loc_reader when advancing 'p' when handling raw strings.
      
      From-SVN: r242552
      David Malcolm committed
  18. 16 Nov, 2016 1 commit
  19. 08 Nov, 2016 1 commit
  20. 29 Oct, 2016 1 commit
  21. 25 Oct, 2016 2 commits
    • input.c/libcpp: fix lifetimes of path buffers · f5ea989d
      Running "make selftest-valgrind" showed various leaks of the form:
      
      408 bytes in 24 blocks are definitely lost in loss record 572 of 679
         at 0x4A0645D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
         by 0x1B0D057: xmalloc (xmalloc.c:148)
         by 0x1ACCAA1: append_file_to_dir(char const*, cpp_dir*) [clone .isra.3] (files.c:1567)
         by 0x1ACD56F: _cpp_find_file (files.c:390)
         by 0x1ACF8FB: cpp_read_main_file(cpp_reader*, char const*) (init.c:632)
         by 0x1AB3D97: selftest::lexer_test::lexer_test(selftest::line_table_case const&, char const*, selftest::lexer_test_options*) (input.c:2014)
         by 0x1AB792B: selftest::test_lexer_string_locations_u8(selftest::line_table_case const&) (input.c:2713)
         by 0x1ABA22A: selftest::for_each_line_table_case(void (*)(selftest::line_table_case const&)) (input.c:3227)
         by 0x1ABA381: selftest::input_c_tests() (input.c:3260)
         by 0x1A295F1: selftest::run_tests() (selftest-run-tests.c:62)
         by 0xF20DC4: toplev::run_self_tests() (toplev.c:2076)
         by 0xF20FCD: toplev::main(int, char**) (toplev.c:2153)
      
      Fix the leak by freeing the file->path in destroy_cpp_file.
      However, doing so would lead to a use-after-free in input.c's file cache
      since the filenames in this cache are the libcpp file->path buffers.
      
      Hence we need to ensure that any references to the file in the input.c
      cache are purged before cleaning up file->path.  This is normally done
      by the temp_source_file dtor.  Hence we need to reorder things to that
      the temp_source_file dtor runs before cleaning up the cpp_parser.  The
      patch does this by introducing a wrapper class around cpp_parser *, so
      that the dtor can run after the dtor for temp_source_file.
      
      gcc/ChangeLog:
      	* input.c (fcache::file_patch): Add comment about lifetime.
      	(selftest::cpp_reader_ptr): New class.
      	(selftest::lexer_test): Convert m_parser from cpp_reader *
      	to a cpp_reader_ptr, and move m_tempfile to after it.
      	(selftest::lexer_test::lexer_test): Update for above reordering.
      	(lexer_test::~lexer_test): Move cleanup of m_parser to
      	cpp_reader_ptr's dtor.
      
      libcpp/ChangeLog:
      	* files.c (destroy_cpp_file): Free file->path.
      
      From-SVN: r241536
      David Malcolm committed
    • Implement ~line_maps () · 2be1b796
      line_maps instances such as the global line_table are
      GC-managed, but the htab within location_adhoc_data_map.htab
      is not GC-managed.
      
      Previously this was deleted manually by a call to
      location_adhoc_data_fini within toplev::main.
      
      However, on adding a call to forcibly_ggc_collect after the
      selftests, all of the htabs for the various line_tables
      created during the selftests start showing up as leaks
      in "make selftest-valgrind", e.g.:
      
      13,536 (1,344 direct, 12,192 indirect) bytes in 12 blocks are definitely lost in loss record 1,065 of 1,086
         at 0x4A081D4: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
         by 0x16DB3B0: xcalloc (xmalloc.c:163)
         by 0x16D8D34: htab_create_typed_alloc (hashtab.c:358)
         by 0x16D8DBD: htab_create_alloc (hashtab.c:286)
         by 0x16A2CCC: linemap_init(line_maps*, unsigned int) (line-map.c:353)
         by 0x1685605: selftest::line_table_test::line_table_test(selftest::line_table_case const&) (input.c:1624)
         by 0x167D09C: selftest::test_applying_fixits_modernize_named_init(selftest::line_table_case const&) (edit-context.c:1430)
         by 0x1686827: selftest::for_each_line_table_case(void (*)(selftest::line_table_case const&)) (input.c:3227)
         by 0x167F067: selftest::edit_context_c_tests() (edit-context.c:1658)
         by 0x1616E67: selftest::run_tests() (selftest-run-tests.c:71)
         by 0xC0DB25: toplev::run_self_tests() (toplev.c:2076)
         by 0x618EB4: toplev::main(int, char**) (toplev.c:2153)
      
      This patch removes the manual one-time cleanup in favor of
      adding a destructor to class line_maps, which cleans up
      the non-GC-managed htab.
      
      Doing so improves "make selftest-valgrind" from:
      
      ==61118== LEAK SUMMARY:
      ==61118==    definitely lost: 121,248 bytes in 1,515 blocks
      ==61118==    indirectly lost: 974,344 bytes in 959 blocks
      ==61118==      possibly lost: 0 bytes in 0 blocks
      ==61118==    still reachable: 1,332,599 bytes in 3,684 blocks
      ==61118==         suppressed: 0 bytes in 0 blocks
      
      to:
      
      ==57182== LEAK SUMMARY:
      ==57182==    definitely lost: 13,840 bytes in 556 blocks
      ==57182==    indirectly lost: 0 bytes in 0 blocks
      ==57182==      possibly lost: 0 bytes in 0 blocks
      ==57182==    still reachable: 1,355,703 bytes in 3,684 blocks
      ==57182==         suppressed: 0 bytes in 0 blocks
      
      gcc/ChangeLog:
      	* toplev.c (toplev::main): Remove call to
      	location_adhoc_data_fini.
      
      libcpp/ChangeLog:
      	* include/line-map.h (line_maps::~line_maps): New dtor.
      	(location_adhoc_data_fini): Delete decl.
      	* line-map.c (line_maps::~line_maps): New dtor.
      	(location_adhoc_data_fini): Delete.
      
      From-SVN: r241533
      David Malcolm committed
  22. 21 Oct, 2016 1 commit
  23. 11 Oct, 2016 1 commit
    • gcc/ · 70f6d5e1
      	* common.opt (Wimplicit-fallthrough) Turn into alias to
      	-Wimplicit-fallthrough=3.  Remove EnabledBy.
      	(Wimplicit-fallthrough=): New option.
      	* gimplify.c (warn_implicit_fallthrough_r): Use
      	OPT_Wimplicit_fallthrough_ instead of OPT_Wimplicit_fallthrough.
      	* doc/invoke.texi (-Wimplicit-fallthrough): Document as alias
      	to -Wimplicit-fallthrough=3.
      	(-Wimplicit-fallthrough=): Document.
      gcc/c-family/
      	* c.opt (Wextra): Add as C/C++/ObjC/ObjC++ option.
      	(Wimplicit-fallthrough=): Enable for these languages by -Wextra.
      	* c-opts.c (sanitize_cpp_opts): Initialize
      	cpp_opts->cpp_warn_implicit_fallthrough.
      gcc/testsuite/
      	* c-c++-common/Wimplicit-fallthrough-25.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-26.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-27.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-28.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-29.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-30.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-31.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-32.c: New test.
      	* c-c++-common/Wimplicit-fallthrough-33.c: New test.
      libcpp/
      	* include/cpplib.h (struct cpp_options): Add
      	cpp_warn_implicit_fallthrough.
      	* init.c (cpp_create_reader): Initialize it to 0.
      	* lex.c (fallthrough_comment_p): Handle different
      	cpp_warn_implicit_fallthrough levels.  Whitespace fixes.
      
      From-SVN: r241013
      Jakub Jelinek committed
  24. 08 Oct, 2016 3 commits
  25. 05 Oct, 2016 1 commit
  26. 26 Sep, 2016 1 commit
  27. 23 Sep, 2016 1 commit
    • Provide location information for terminator characters (PR preprocessor/77672) · bbd6fcf3
      substring_loc::get_location currently fails for the final terminator
      character in a STRING_CST from the C frontend, so that format_warning_va
      falls back to using the location of the string as a whole.
      
      This patch tweaks things [1] so that we use the final closing quote
      as the location of the terminator character, as requested in
      PR preprocessor/77672.
      
      [1] specifically, cpp_interpret_string_1.
      
      gcc/ChangeLog:
      	PR preprocessor/77672
      	* input.c (selftest::test_lexer_string_locations_simple): Update
      	test to expect location information of the terminator character
      	at the location of the final closing quote.
      	(selftest::test_lexer_string_locations_hex): Likewise.
      	(selftest::test_lexer_string_locations_oct): Likewise.
      	(selftest::test_lexer_string_locations_letter_escape_1): Likewise.
      	(selftest::test_lexer_string_locations_letter_escape_2): Likewise.
      	(selftest::test_lexer_string_locations_ucn4): Likewise.
      	(selftest::test_lexer_string_locations_ucn8): Likewise.
      	(selftest::test_lexer_string_locations_u8): Likewise.
      	(selftest::test_lexer_string_locations_utf8_source): Likewise.
      	(selftest::test_lexer_string_locations_concatenation_1): Likewise.
      	(selftest::test_lexer_string_locations_concatenation_2): Likewise.
      	(selftest::test_lexer_string_locations_concatenation_3): Likewise.
      	(selftest::test_lexer_string_locations_macro): Likewise.
      	(selftest::test_lexer_string_locations_long_line): Likewise.
      
      gcc/testsuite/ChangeLog:
      	PR preprocessor/77672
      	* gcc.dg/plugin/diagnostic-test-string-literals-1.c
      	(test_terminator_location): New function.
      
      libcpp/ChangeLog:
      	PR preprocessor/77672
      	* charset.c (cpp_interpret_string_1): Add a source_range for the
      	NUL-terminator, using the location of the trailing quote of the
      	final string.
      
      From-SVN: r240434
      David Malcolm committed
  28. 21 Sep, 2016 1 commit
  29. 15 Sep, 2016 1 commit
    • fix-it hints can't contain newlines · 31316208
      I hope to implement newline support within fix-it hints at some point,
      but currently it's not supported, and leads to misleading diagnostic
      output, so for now, fail gracefully.
      
      gcc/ChangeLog:
      	* diagnostic-show-locus.c
      	(selftest::test_fixit_insert_containing_newline): New function.
      	(selftest::test_fixit_replace_containing_newline): New function.
      	(selftest::diagnostic_show_locus_c_tests): Call the above.
      
      libcpp/ChangeLog:
      	* include/line-map.h (class rich_location): Note that newlines
      	aren't supported in fix-it text.
      	* line-map.c (rich_location::add_fixit_insert_before): Reject
      	attempts to add fix-its containing newlines.
      	(rich_location::add_fixit_replace): Likewise.
      
      From-SVN: r240169
      David Malcolm committed
  30. 13 Sep, 2016 1 commit
    • fix-it hints: insert_before vs insert_after · 254830ba
      The API for adding "insert text" fix-it hints was unclear
      about exactly where the text should be inserted relative
      to the given insertion point.
      
      This patch clarifies things by renaming the pertinent methods from
        richloc.add_fixit_insert
      to
        richloc.add_fixit_insert_before
      and adding:
        richloc.add_fixit_insert_after
      
      The latter allows us to consolidate some failure-handling into
      class rich_location, rather than having to have every such diagnostic
      check for it.
      
      The patch also adds a description of how fix-it hints work to the
      comment for class rich_location within libcpp/include/line-map.h.
      
      gcc/c-family/ChangeLog:
      	* c-common.c (warn_logical_not_parentheses): Replace
      	rich_location::add_fixit_insert calls with add_fixit_insert_before
      	and add_fixit_insert_after, eliminating the "next_loc" calculation.
      
      gcc/c/ChangeLog:
      	* c-parser.c (c_parser_declaration_or_fndef): Update for renaming
      	of add_fixit_insert to add_fixit_insert_before.
      
      gcc/cp/ChangeLog:
      	* parser.c (cp_parser_class_specifier_1): Update for renaming of
      	add_fixit_insert to add_fixit_insert_before.
      	(cp_parser_class_head): Likewise.
      
      gcc/ChangeLog:
      	* diagnostic-show-locus.c (selftest::test_one_liner_fixit_insert):
      	Rename to...
      	(selftest::test_one_liner_fixit_insert_before): ...this, and update
      	for renaming of add_fixit_insert to add_fixit_insert_before.
      	(selftest::test_one_liner_fixit_insert_after): New function.
      	(selftest::test_one_liner_fixit_validation_adhoc_locations):
      	Update for renaming of add_fixit_insert to
      	add_fixit_insert_before.
      	(selftest::test_one_liner_many_fixits): Likewise.
      	(selftest::test_diagnostic_show_locus_one_liner): Update for
      	renaming, call new test function.
      	(selftest::test_diagnostic_show_locus_fixit_lines): Update for
      	renaming of add_fixit_insert to add_fixit_insert_before.
      	(selftest::test_fixit_consolidation): Likewise.
      	* diagnostic.c (selftest::test_print_parseable_fixits_insert):
      	Likewise.
      	* edit-context.c (selftest::test_applying_fixits_insert): Rename
      	to...
      	(selftest::test_applying_fixits_insert_before): ...this.
      	(selftest::test_applying_fixits_insert): Update for renaming of
      	add_fixit_insert to add_fixit_insert_before.
      	(selftest::test_applying_fixits_insert_after): New function.
      	(selftest::test_applying_fixits_insert_after_at_line_end): New
      	function.
      	(selftest::test_applying_fixits_insert_after_failure): New
      	function.
      	(selftest::test_applying_fixits_multiple): Update for renaming of
      	add_fixit_insert to add_fixit_insert_before.
      	(selftest::change_line): Likewise.
      	(selftest::test_applying_fixits_unreadable_file): Likewise.
      	(selftest::test_applying_fixits_line_out_of_range): Likewise.
      	(selftest::test_applying_fixits_column_validation): Likewise.
      	(selftest::test_applying_fixits_column_validation): Likewise.
      	(selftest::edit_context_c_tests): Update for renamed test
      	function; call new test functions.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
      	(test_show_locus): Replace rich_location::add_fixit_insert calls
      	with add_fixit_insert_before and add_fixit_insert_after.
      
      libcpp/ChangeLog:
      	* include/line-map.h (class rich_location): Add description of
      	fix-it hints to leading comment.
      	(rich_location::add_fixit_insert): Rename both overloaded methods
      	to..
      	(rich_location::add_fixit_insert_before): ...this, updating their
      	comments.
      	(rich_location::add_fixit_insert_after): Two new overloaded
      	methods.
      	(rich_location::stop_supporting_fixits): New method.
      	* line-map.c (rich_location::add_fixit_insert): Rename both
      	overloaded methods to..
      	(rich_location::add_fixit_insert_before): ...this, updating their
      	comments.
      	(rich_location::add_fixit_insert_after): Two new methods.
      	(rich_location::reject_impossible_fixit): Split out
      	failure-handling into...
      	(rich_location::stop_supporting_fixits): New method.
      
      From-SVN: r240115
      David Malcolm committed
  31. 02 Sep, 2016 1 commit
    • Introduce class edit_context · c65236d6
      gcc/ChangeLog:
      	* Makefile.in (OBJS-libcommon): Add edit-context.o.
      	* diagnostic-color.c (color_dict): Add "diff-filename",
      	"diff-hunk", "diff-delete", and "diff-insert".
      	(parse_gcc_colors): Update default value of GCC_COLORS in comment
      	to reflect above changes.
      	* doc/invoke.texi (-fdiagnostics-color): Update description of
      	default GCC_COLORS, and of the supported capabilities.
      	* edit-context.c: New file.
      	* edit-context.h: New file.
      	* input.c (struct fcache): Add field "missing_trailing_newline".
      	(diagnostics_file_cache_forcibly_evict_file): Initialize it to
      	true.
      	(add_file_to_cache_tab): Likewise.
      	(fcache::fcache): Likewise.
      	(get_next_line): Update c->missing_trailing_newline.
      	(location_missing_trailing_newline): New function.
      	* input.h (location_missing_trailing_newline): New decl.
      	* selftest-run-tests.c (selftest::run_tests): Call
      	edit_context_c_tests.
      	* selftest.h (edit_context_c_tests): New decl.
      
      libcpp/ChangeLog:
      	* include/line-map.h (rich_location::seen_impossible_fixit_p): New
      	accessor.
      
      From-SVN: r239963
      David Malcolm committed
  32. 31 Aug, 2016 2 commits
    • diagnostic-show-locus.c: handle fixits on lines outside the regular ranges · 3d4f9f87
      The diagnostic_show_locus implementation determines the set
      of line spans that need printing based on the ranges within the
      rich_location (in layout::calculate_line_spans).
      
      Currently this doesn't take into account fix-it hints, and hence
      we fail to print fix-it hints that are on lines outside of
      those ranges.
      
      This patch updates the implementation to take fix-it hints into
      account when calculating the pertinent line spans, so that such fix-it
      hints do get printed.  It also adds some validation, to ensure that
      we don't attempt to print fix-its hints affecting a different source
      file.
      
      gcc/ChangeLog:
      	* diagnostic-show-locus.c (class layout): Add field m_fixit_hints.
      	(layout_range::intersects_line_p): New method.
      	(test_range_contains_point_for_single_point): Rename to...
      	(test_layout_range_for_single_point): ...this, and add testing
      	for layout_range::intersects_line_p.
      	(test_range_contains_point_for_single_line): Rename to...
      	(test_layout_range_for_single_line): ...this,  and add testing
      	for layout_range::intersects_line_p.
      	(test_range_contains_point_for_multiple_lines): Rename to...
      	(test_layout_range_for_multiple_lines): ...this,  and add testing
      	for layout_range::intersects_line_p.
      	(layout::layout): Populate m_fixit_hints.
      	(layout::get_expanded_location): Handle the case of a line-span
      	for a fix-it hint.
      	(layout::validate_fixit_hint_p): New method.
      	(get_line_span_for_fixit_hint): New function.
      	(layout::calculate_line_spans): Add spans for fixit-hints.
      	(layout::should_print_annotation_line_p): New method.
      	(layout::print_any_fixits): Drop param "richloc", instead using
      	validated fixits in m_fixit_hints.  Add "const" to hint pointers.
      	(diagnostic_show_locus): Avoid printing blank annotation lines.
      	(selftest::test_diagnostic_context::test_diagnostic_context):
      	Initialize show_column and start_span.
      	(selftest::test_diagnostic_context::start_span_cb): New static
      	function.
      	(selftest::test_diagnostic_show_locus_fixit_lines): New function.
      	(selftest::diagnostic_show_locus_c_tests): Update for function
      	renamings.  Call test_diagnostic_show_locus_fixit_lines.
      
      libcpp/ChangeLog:
      	* include/line-map.h (class fixit_remove): Remove stray decl.
      	(fixit_hint::affects_line_p): Make const.
      	(fixit_insert::affects_line_p): Likewise.
      	(fixit_replace::affects_line_p): Likewise.
      	* line-map.c (fixit_insert::affects_line_p): Likewise.
      	(fixit_replace::affects_line_p): Likewise.
      
      From-SVN: r239906
      David Malcolm committed
    • Remove arbitrary limits from rich_location · b816477a
      This patch eliminates the hard-coded limits within rich_location
      (up to 3 ranges, up to 2 fixits).  The common case is still
      handled by embedding the values inside rich_location - it only
      uses dynamic allocation if these limits are exceeded, so
      creation of rich_location instances on the stack should still
      be fast.  This is implemented via a new container class,
      semi_embedded_vec <T, N>.
      
      gcc/ChangeLog:
      	* diagnostic-show-locus.c (colorizer::begin_state): Support more
      	than 3 ranges per diagnostic by alternating between color 1 and
      	color 2.
      	(layout::layout): Replace use of rich_location::MAX_RANGES
      	with richloc->get_num_locations ().
      	(layout::calculate_line_spans): Replace use of
      	rich_location::MAX_RANGES with m_layout_ranges.length ().
      	(layout::print_annotation_line): Handle arbitrary numbers of
      	ranges in caret-printing by defaulting to '^'.
      	(selftest::test_one_liner_many_fixits): New function.
      	(test_diagnostic_show_locus_one_liner): Call it.
      	* diagnostic.c (diagnostic_initialize): Update for renaming
      	of rich_location::MAX_RANGES to
      	rich_location::STATICALLY_ALLOCATED_RANGES.
      	* diagnostic.h (struct diagnostic_context): Likewise.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/plugin/diagnostic-test-show-locus-bw.c
      	(test_many_nested_locations): New function.
      	* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
      	(test_show_locus): Handle "test_many_nested_locations".
      
      libcpp/ChangeLog:
      	* include/line-map.h (class semi_embedded_vec): New class.
      	(semi_embedded_vec<T, NUM_EMBEDDED>::semi_embedded_vec): New ctor.
      	(semi_embedded_vec<T, NUM_EMBEDDED>::~semi_embedded_vec): New
      	dtor.
      	(semi_embedded_vec<T, NUM_EMBEDDED>::operator[]): New methods.
      	(semi_embedded_vec<T, NUM_EMBEDDED>::push): New method.
      	(semi_embedded_vec<T, NUM_EMBEDDED>::truncate): New method.
      	(rich_location::get_num_locations): Reimplement in terms of
      	m_ranges.
      	(rich_location::get_range): Make non-inline.
      	(rich_location::get_num_fixit_hints): Reimplement in terms of
      	m_fixit_hints.
      	(rich_location::add_fixit): New function.
      	(rich_location::MAX_RANGES): Rename to...
      	(rich_location::STATICALLY_ALLOCATED_RANGES): ...this.
      	(rich_location::MAX_FIXIT_HINTS): Rename to...
      	(rich_location::STATICALLY_ALLOCATED_RANGES): ...this, and make
      	private.
      	(rich_location::m_num_ranges): Eliminate in favor of...
      	(rich_location::m_ranges): ...this, converting from a fixed-size
      	array to a semi_embedded_vec.
      	(rich_location::m_num_fixit_hints): Eliminate in favor of...
      	(rich_location::m_fixit_hints): ...this, converting from a
      	fixed-size array to a semi_embedded_vec.
      	* line-map.c (rich_location::rich_location): Update for above
      	changes.
      	(rich_location::~rich_location): Likewise.
      	(rich_location::get_loc): Likewise.
      	(rich_location::get_range): New methods.
      	(rich_location::add_range): Update for above changes.
      	(rich_location::set_range): Likewise.
      	(rich_location::add_fixit_insert): Likewise.
      	(rich_location::add_fixit_replace): Likewise.
      	(rich_location::get_last_fixit_hint): Likewise.
      	(rich_location::reject_impossible_fixit): Likewise.
      	(rich_location::add_fixit): New method.
      
      From-SVN: r239879
      David Malcolm committed
  33. 30 Aug, 2016 1 commit
    • rich_location: add convenience overloads for adding fix-it hints · f9087798
      Adding a fix-it hint to a diagnostic usually follows one of these
      patterns:
      (a) an insertion fix-its, with the insertion at the primary caret location
      (b) a removals/replacements, affecting the range of the primary location
      
      (other cases are possible, e.g. multiple fix-its, and affecting other
      locations, but these are the common ones)
      
      Given these common cases, this patch adds overloads of the rich_location
      methods for adding fix-it hints, so that the location information can
      be omitted if it matches that of the primary location within the
      rich_location.
      
      Similarly when adding "remove" and "replace" fix-it hints to a diagnostic,
      it's tedious to have to extract the source_range from a location_t
      (aka source_location).  To make this more convenient, this patch
      adds overload of the rich_location::add_fixit_remove/replace methods,
      accepting a source_location directly.
      
      The patch updates the various in-tree users of fix-it hints to use
      the new simpler API where appropriate.  I didn't touch the case where
      there are multiple fix-its in one rich_location, as it seems better to
      be more explicit about locations for this case (adding a pair of parens
      in warn_logical_not_parentheses).
      
      The above makes the gcc_rich_location::add_fixit_misspelled_id overload
      taking a const char * rather redundant, so I eliminated it.
      
      gcc/c/ChangeLog:
      	* c-decl.c (implicit_decl_warning): Use add_fixit_replace
      	rather than add_fixit_misspelled_id.
      	(undeclared_variable): Likewise.
      	* c-parser.c (c_parser_declaration_or_fndef): Likewise.  Remove
      	now-redundant "here" params from add_fixit_insert method calls.
      	(c_parser_parameter_declaration): Likewise.
      	* c-typeck.c (build_component_ref): Remove now-redundant range
      	param from add_fixit_replace method calls.
      
      gcc/cp/ChangeLog:
      	* name-lookup.c (suggest_alternatives_for): Use add_fixit_replace
      	rather than add_fixit_misspelled_id.
      	* parser.c (cp_parser_diagnose_invalid_type_name): Likewise.
      
      gcc/ChangeLog:
      	* diagnostic-show-locus.c (test_one_liner_fixit_insert): Remove
      	redundant location param.
      	(test_one_liner_fixit_remove): Likewise.
      	(test_one_liner_fixit_replace): Likewise.
      	(test_one_liner_fixit_replace_equal_secondary_range): Likewise.
      	* gcc-rich-location.c
      	(gcc_rich_location::add_fixit_misspelled_id): Eliminate call to
      	get_range_from_loc.  Drop overload taking a const char *.
      	* gcc-rich-location.h
      	(gcc_rich_location::add_fixit_misspelled_id): Drop overload taking
      	a const char *.
      
      libcpp/ChangeLog:
      	* include/line-map.h (rich_location::add_fixit_insert): Add
      	comments.  Add overload omitting the source_location param.
      	(rich_location::add_fixit_remove): Add comments.  Add overloads
      	omitting the range, and accepting a source_location.
      	(rich_location::add_fixit_replace): Likewise.
      	* line-map.c (rich_location::add_fixit_insert): Add comments.  Add
      	overload omitting the source_location param.
      	(rich_location::add_fixit_remove): Add comments.  Add overloads
      	omitting the range, and accepting a source_location.
      	(rich_location::add_fixit_replace): Likewise.
      
      From-SVN: r239861
      David Malcolm committed
  34. 29 Aug, 2016 1 commit
    • Allow the use of ad-hoc locations for fix-it hints · 2aa51413
      Currently the fix-it validator rejects ad-hoc locations.
      Fix this by calling get_pure_location on the input locations to
      add_fixit_insert/replace.  Doing so requires moving get_pure_location
      from gcc to libcpp.
      
      gcc/ChangeLog:
      	* diagnostic-show-locus.c
      	(selftest::test_one_liner_fixit_validation_adhoc_locations): New
      	function.
      	(selftest::test_diagnostic_show_locus_one_liner): Call it.
      	* input.c (get_pure_location): Move to libcpp/line-map.c.
      	* input.h (get_pure_location): Convert decl to an inline function
      	calling implementation in libcpp.
      
      libcpp/ChangeLog:
      	* include/line-map.h (get_pure_location): New decl.
      	* line-map.c (get_pure_location): Move here, from gcc/input.c, adding
      	a line_maps * param.
      	(rich_location::add_fixit_insert): Call get_pure_location on "where".
      	(rich_location::add_fixit_replace): Call get_pure_location on the
      	end-points.
      
      From-SVN: r239843
      David Malcolm committed