![]() The existing fix-it printer can lead to difficult-to-read output when fix-it hints are near each other. For example, in a recent patch to add fix-it hints to the C++ frontend's -Wold-style-cast, e.g. for: foo *f = (foo *)ptr->field; ^~~~~ the fix-it hints: replace the open paren with "const_cast<" replace the close paren with "> (" insert ")" after the "ptr->field" would be printed in this odd-looking way: foo *f = (foo *)ptr->field; ^~~~~ - const_cast< - > ( ) class rich_location consolidates adjacent fix-it hints, which helps somewhat, but the underlying problem is that the existing printer simply walks through the list of hints printing them, starting newlines as necessary. This patch reimplements fix-it printing by introducing a planning stage: a new class line_corrections "plans" how to print the fix-it hints affecting a line, generating a vec of "correction" instances. Hints that are sufficiently close to each other are consolidated at this stage. This leads to the much more reasonable output for the above case: foo *f = (foo *)ptr->field; ^~~~~ ----------------- const_cast<foo *> (ptr->field); where the 3 hints are consolidated into one "correction" at printing. gcc/ChangeLog: * diagnostic-show-locus.c (struct column_range): New struct. (get_affected_columns): New function. (get_printed_columns): New function. (struct correction): New struct. (correction::ensure_capacity): New function. (correction::ensure_terminated): New function. (struct line_corrections): New struct. (line_corrections::~line_corrections): New dtor. (line_corrections::add_hint): New function. (layout::print_trailing_fixits): Reimplement in terms of the new classes. (selftest::test_overlapped_fixit_printing): New function. (selftest::diagnostic_show_locus_c_tests): Call it. From-SVN: r247548 |
||
---|---|---|
config | ||
contrib | ||
fixincludes | ||
gcc | ||
gnattools | ||
gotools | ||
include | ||
INSTALL | ||
intl | ||
libada | ||
libatomic | ||
libbacktrace | ||
libcc1 | ||
libcilkrts | ||
libcpp | ||
libdecnumber | ||
libffi | ||
libgcc | ||
libgfortran | ||
libgo | ||
libgomp | ||
libhsail-rt | ||
libiberty | ||
libitm | ||
libmpx | ||
libobjc | ||
liboffloadmic | ||
libquadmath | ||
libsanitizer | ||
libssp | ||
libstdc++-v3 | ||
libvtv | ||
lto-plugin | ||
maintainer-scripts | ||
zlib | ||
.dir-locals.el | ||
.gitattributes | ||
.gitignore | ||
ABOUT-NLS | ||
ChangeLog | ||
ChangeLog.jit | ||
ChangeLog.tree-ssa | ||
compile | ||
config-ml.in | ||
config.guess | ||
config.rpath | ||
config.sub | ||
configure | ||
configure.ac | ||
COPYING | ||
COPYING.LIB | ||
COPYING.RUNTIME | ||
COPYING3 | ||
COPYING3.LIB | ||
depcomp | ||
install-sh | ||
libtool-ldflags | ||
libtool.m4 | ||
ltgcc.m4 | ||
ltmain.sh | ||
ltoptions.m4 | ||
ltsugar.m4 | ||
ltversion.m4 | ||
lt~obsolete.m4 | ||
MAINTAINERS | ||
Makefile.def | ||
Makefile.in | ||
Makefile.tpl | ||
missing | ||
mkdep | ||
mkinstalldirs | ||
move-if-change | ||
README | ||
symlink-tree | ||
ylwrap |
This directory contains the GNU Compiler Collection (GCC). The GNU Compiler Collection is free software. See the files whose names start with COPYING for copying permission. The manuals, and some of the runtime libraries, are under different terms; see the individual source files for details. The directory INSTALL contains copies of the installation information as HTML and plain text. The source of this information is gcc/doc/install.texi. The installation information includes details of what is included in the GCC sources and what files GCC installs. See the file gcc/doc/gcc.texi (together with other files that it includes) for usage and porting information. An online readable version of the manual is in the files gcc/doc/gcc.info*. See http://gcc.gnu.org/bugs/ for how to report bugs usefully. Copyright years on GCC source files may be listed using range notation, e.g., 1987-2012, indicating that every year in the range, inclusive, is a copyrightable year that could otherwise be listed individually.