PR c/70264: fix crash in compatible_locations_p with BUILTINS_LOCATION
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 17 Mar 2016 18:27:47 +0000 (18:27 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Thu, 17 Mar 2016 18:27:47 +0000 (18:27 +0000)
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

gcc/ChangeLog
gcc/diagnostic-show-locus.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr70264.c [new file with mode: 0644]

index b7711b8d00b5c15564c56e731664093d5b3b7936..4a74494a4cb907ab21492218420e14ba844c1bcd 100644 (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
index f10ade5591cf6f2253ba2ec993ddbcba6fdc677a..bf956661252e63825ab97ef6082de1468b4f9c28 100644 (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);
 
index 7fe729594a05fe52a921268520ecb56ec0b95fa3..b3c16b552324ebb49e1ad674c7b6126d7de189a1 100644 (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
diff --git a/gcc/testsuite/c-c++-common/pr70264.c b/gcc/testsuite/c-c++-common/pr70264.c
new file mode 100644 (file)
index 0000000..815aad1
--- /dev/null
@@ -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 "" } */