line-map.h (linemap_assert_fails): Declare.
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 2 Dec 2014 16:03:31 +0000 (16:03 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 2 Dec 2014 16:03:31 +0000 (16:03 +0000)
libcpp/ChangeLog:

2014-12-02  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* include/line-map.h (linemap_assert_fails): Declare.
* line-map.c (linemap_position_for_loc_and_offset): Use it.

From-SVN: r218277

libcpp/ChangeLog
libcpp/include/line-map.h
libcpp/line-map.c

index 4bfd329a2ad29a1887cd47d43541deb07f348ecb..afb0f791f2c5a8c7838eda52721f5b4a5e889b9f 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-02  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * include/line-map.h (linemap_assert_fails): Declare.
+       * line-map.c (linemap_position_for_loc_and_offset): Use it.
+
 2014-12-02  Manuel López-Ibáñez  <manu@gcc.gnu.org>
 
         * line-map.c (linemap_add): Fix typo.
index edcbdc9bd661d2595914f5d3cce88b9cef657287..48a5dec31e0fb15ef2e5a211c0a92e9ef0820919 100644 (file)
@@ -579,6 +579,16 @@ bool linemap_location_from_macro_expansion_p (const struct line_maps *,
     if (! (EXPR))                              \
       abort ();                                        \
   } while (0)
+/* Assert that becomes a conditional expression when checking is disabled at
+   compilation time.  Use this for conditions that should not happen but if
+   they happen, it is better to handle them gracefully rather than crash
+   randomly later. 
+   Usage:
+
+   if (linemap_assert_fails(EXPR)) handle_error(); */
+#define linemap_assert_fails(EXPR) __extension__ \
+  ({linemap_assert (EXPR); false;}) 
 
 /* Assert that MAP encodes locations of tokens that are not part of
    the replacement-list of a macro expansion.  */
@@ -588,6 +598,7 @@ bool linemap_location_from_macro_expansion_p (const struct line_maps *,
 #else
 /* Include EXPR, so that unused variable warnings do not occur.  */
 #define linemap_assert(EXPR) ((void)(0 && (EXPR)))
+#define linemap_assert_fails(EXPR) (! (EXPR))
 #define linemap_check_ordinary(LINE_MAP) (LINE_MAP)
 #endif
 
index c9838a81721bf60ed2399f017c9346404d840ec2..6a695ab0f1bb6d74a39da39358e9d17e5dd85a42 100644 (file)
@@ -645,7 +645,9 @@ linemap_position_for_loc_and_offset (struct line_maps *set,
   const struct line_map * map = NULL;
 
   /* This function does not support virtual locations yet.  */
-  linemap_assert (!linemap_location_from_macro_expansion_p (set, loc));
+  if (linemap_assert_fails
+      (!linemap_location_from_macro_expansion_p (set, loc)))
+    return loc;
 
   if (offset == 0
       /* Adding an offset to a reserved location (like
@@ -658,22 +660,27 @@ linemap_position_for_loc_and_offset (struct line_maps *set,
   loc = linemap_resolve_location (set, loc, LRK_SPELLING_LOCATION, &map);
   /* The new location (loc + offset) should be higher than the first
      location encoded by MAP.  */
-  linemap_assert (MAP_START_LOCATION (map) < loc + offset);
+  if (linemap_assert_fails (MAP_START_LOCATION (map) < loc + offset))
+    return loc;
 
   /* If MAP is not the last line map of its set, then the new location
      (loc + offset) should be less than the first location encoded by
      the next line map of the set.  */
   if (map != LINEMAPS_LAST_ORDINARY_MAP (set))
-    linemap_assert (loc + offset < MAP_START_LOCATION (&map[1]));
+    if (linemap_assert_fails (loc + offset < MAP_START_LOCATION (&map[1])))
+      return loc;
 
   offset += SOURCE_COLUMN (map, loc);
-  linemap_assert (offset < (1u << map->d.ordinary.column_bits));
+  if (linemap_assert_fails (offset < (1u << map->d.ordinary.column_bits)))
+    return loc;
 
   source_location r = 
     linemap_position_for_line_and_column (map,
                                          SOURCE_LINE (map, loc),
                                          offset);
-  linemap_assert (map == linemap_lookup (set, r));
+  if (linemap_assert_fails (map == linemap_lookup (set, r)))
+    return loc;
+
   return r;
 }