line-map.h (linemap_assert_fails): Declare.

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
This commit is contained in:
Manuel López-Ibáñez 2014-12-02 16:03:31 +00:00
parent 9c320ab1f1
commit 73bd83290a
3 changed files with 28 additions and 5 deletions

View 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.

View 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

View 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;
}