PR c/70264: fix crash in compatible_locations_p with BUILTINS_LOCATION

In r234088 my fix for PR c++/70105 didn't allow for the possibility that
when comparing a pair of macro expansion histories that one of the
macros in the history might not be located within a line-map, and
PR c/70264 reports a crash due to encountering BUILTINS_LOCATION within
the traversal.

Fixed thusly.

Successfully bootstrapped on x86_64-pc-linux-gnu; adds 4 PASS results
to gcc.sum and 12 to g++.sum.

gcc/ChangeLog:
	PR c/70264
	* diagnostic-show-locus.c (compatible_locations_p): Handle the case
	where one or both locations aren't within a line_map.

gcc/testsuite/ChangeLog:
	PR c/70264
	* c-c++-common/pr70264.c: New test case.

From-SVN: r234303
This commit is contained in:
David Malcolm 2016-03-17 18:27:47 +00:00 committed by David Malcolm
parent 17366700d4
commit ded6091379
4 changed files with 30 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2016-03-17 David Malcolm <dmalcolm@redhat.com>
PR c/70264
* diagnostic-show-locus.c (compatible_locations_p): Handle the case
where one or both locations aren't within a line_map.
2016-03-17 H.J. Lu <hongjiu.lu@intel.com>
PR driver/70192

View File

@ -486,6 +486,12 @@ compatible_locations_p (location_t loc_a, location_t loc_b)
if (IS_ADHOC_LOC (loc_b))
loc_b = get_location_from_adhoc_loc (line_table, loc_b);
/* If either location is one of the special locations outside of a
linemap, they are only compatible if they are equal. */
if (loc_a < RESERVED_LOCATION_COUNT
|| loc_b < RESERVED_LOCATION_COUNT)
return loc_a == loc_b;
const line_map *map_a = linemap_lookup (line_table, loc_a);
linemap_assert (map_a);

View File

@ -1,3 +1,8 @@
2016-03-17 David Malcolm <dmalcolm@redhat.com>
PR c/70264
* c-c++-common/pr70264.c: New test case.
2016-03-17 Jakub Jelinek <jakub@redhat.com>
PR c++/70144

View File

@ -0,0 +1,13 @@
/* { dg-options "-fdiagnostics-show-caret" } */
#define X __LINE__ /* { dg-error "expected" } */
X
/* { dg-begin-multiline-output "" }
#define X __LINE__
^
{ dg-end-multiline-output "" } */
/* { dg-begin-multiline-output "" }
X
^
{ dg-end-multiline-output "" } */