gcc/libcpp
David Malcolm b4f3232d69 PR c++/70105: prevent nonsensical underline spew for macro expansions
diagnostic_show_locus can sometimes do the wrong thing when handling
expressions built up from macros.

PR c++/70105 (currently marked as a P3 regression) has an example of
a diagnostic where over 500 lines of irrelevant source are printed,
and underlined, giving >1000 lines of useless spew to stderr.

This patch adds extra sanitization to diagnostic-show-locus.c, so that
we only attempt to print underlines and secondary locations if such
locations are "sufficiently sane" relative to the primary location
of a diagnostic.

This "sufficiently sane" condition is implemented by a new helper
function compatible_locations_p, which requires such locations to
have the same macro expansion hierarchy as the primary location,
using linemap_macro_map_loc_unwind_toward_spelling, effectively
mimicing the expansion performed by LRK_SPELLING_LOCATION.

This may be too strong a condition, but it effectively fixes
PR c++/70105, without removing any underlines in my testing.

Successfully bootstrapped&regrtested in combination with the previous
patch on x86_64-pc-linux-gnu; adds 15 new PASS results to g++.sum
and 4 new PASS results to gcc.sum.

gcc/ChangeLog:
	PR c/68473
	PR c++/70105
	* diagnostic-show-locus.c (compatible_locations_p): New function.
	(layout::layout): Sanitize ranges using compatible_locations_p.

gcc/testsuite/ChangeLog:
	PR c/68473
	PR c++/70105
	* g++.dg/diagnostic/pr70105.C: New test.
	* gcc.dg/plugin/diagnostic-test-expressions-1.c (foo): New decl.
	(test_multiple_ordinary_maps): New test function.

libcpp/ChangeLog:
	PR c/68473
	PR c++/70105
	* line-map.c (linemap_macro_map_loc_unwind_toward_spelling): Move
	decl...
	* include/line-map.h
	(linemap_macro_map_loc_unwind_toward_spelling): ...here,
	converting from static to extern.

From-SVN: r234088
2016-03-09 18:23:27 +00:00
..
include PR c++/70105: prevent nonsensical underline spew for macro expansions 2016-03-09 18:23:27 +00:00
po * sr.po: Update. 2016-03-05 12:07:03 +00:00
aclocal.m4 libcpp: Bump to automake 1.11.6 2015-05-13 11:02:17 +00:00
ChangeLog PR c++/70105: prevent nonsensical underline spew for macro expansions 2016-03-09 18:23:27 +00:00
ChangeLog.jit Merger of dmalcolm/jit branch from git 2014-11-11 21:55:52 +00:00
charset.c re PR c++/69628 (Conditional jump or move depends on uninitialised value(s) in lex_charconst(cpp_token const*) (c-lex.c:1252)) 2016-02-05 20:39:48 +01:00
config.in ENABLE_CHECKING refactoring: remove remaining occurrences 2015-11-04 15:01:46 +00:00
configure ENABLE_CHECKING refactoring: remove remaining occurrences 2015-11-04 15:01:46 +00:00
configure.ac ENABLE_CHECKING refactoring: remove remaining occurrences 2015-11-04 15:01:46 +00:00
directives-only.c Update copyright years. 2016-01-04 15:30:50 +01:00
directives.c * directives.c (destringize_and_run): Adjust prototype. 2016-01-28 15:33:55 +01:00
errors.c PR preprocessor/69664: fix rich_location::override_column 2016-02-08 17:33:45 +00:00
expr.c Update copyright years. 2016-01-04 15:30:50 +01:00
files.c re PR pch/68176 (all pch tests fail on eglibc systems (with bits/predefs.h)) 2016-01-28 23:35:20 +01:00
identifiers.c Update copyright years. 2016-01-04 15:30:50 +01:00
init.c Update copyright years. 2016-01-04 15:30:50 +01:00
internal.h libcpp: use better locations for _Pragma tokens (preprocessor/69126) 2016-01-27 18:57:51 +00:00
lex.c Update copyright years. 2016-01-04 15:30:50 +01:00
line-map.c PR c++/70105: prevent nonsensical underline spew for macro expansions 2016-03-09 18:23:27 +00:00
location-example.txt Source range tracking in libcpp and C FE, with bit-packing optimization 2015-11-13 16:29:59 +00:00
macro.c libcpp: use better locations for _Pragma tokens (preprocessor/69126) 2016-01-27 18:57:51 +00:00
Makefile.in Update copyright years. 2016-01-04 15:30:50 +01:00
makeucnid.c Update copyright years. 2016-01-04 15:30:50 +01:00
mkdeps.c Update copyright years. 2016-01-04 15:30:50 +01:00
pch.c Update copyright years. 2016-01-04 15:30:50 +01:00
symtab.c Update copyright years. 2016-01-04 15:30:50 +01:00
system.h Update copyright years. 2016-01-04 15:30:50 +01:00
traditional.c Update copyright years. 2016-01-04 15:30:50 +01:00
ucnid.h Update copyright years. 2016-01-04 15:30:50 +01:00
ucnid.tab Update copyright years. 2016-01-04 15:30:50 +01:00