Commit e7864d68 by David Malcolm Committed by David Malcolm

Fix crash in selftest::test_lexer_string_locations_ucn4 (PR bootstrap/72823)

libcpp/ChangeLog:
	PR bootstrap/72823
	* charset.c (_cpp_valid_ucn): Replace overzealous assert with one
	that allows for char_range to be non-NULL when loc_reader is NULL.

From-SVN: r239211
parent 851e6c6a
2016-08-06 David Malcolm <dmalcolm@redhat.com>
PR bootstrap/72823
* charset.c (_cpp_valid_ucn): Replace overzealous assert with one
that allows for char_range to be non-NULL when loc_reader is NULL.
2016-08-05 David Malcolm <dmalcolm@redhat.com> 2016-08-05 David Malcolm <dmalcolm@redhat.com>
* charset.c (cpp_substring_ranges::cpp_substring_ranges): New * charset.c (cpp_substring_ranges::cpp_substring_ranges): New
......
...@@ -1027,7 +1027,7 @@ ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c, ...@@ -1027,7 +1027,7 @@ ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c,
IDENTIFIER_POS is 0 when not in an identifier, 1 for the start of IDENTIFIER_POS is 0 when not in an identifier, 1 for the start of
an identifier, or 2 otherwise. an identifier, or 2 otherwise.
If CHAR_RANGE and LOC_READER are non-NULL, then position information is If LOC_READER is non-NULL, then position information is
read from *LOC_READER and CHAR_RANGE->m_finish is updated accordingly. */ read from *LOC_READER and CHAR_RANGE->m_finish is updated accordingly. */
bool bool
...@@ -1042,10 +1042,6 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, ...@@ -1042,10 +1042,6 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
const uchar *str = *pstr; const uchar *str = *pstr;
const uchar *base = str - 2; const uchar *base = str - 2;
/* char_range and loc_reader must either be both NULL, or both be
non-NULL. */
gcc_assert ((char_range != NULL) == (loc_reader != NULL));
if (!CPP_OPTION (pfile, cplusplus) && !CPP_OPTION (pfile, c99)) if (!CPP_OPTION (pfile, cplusplus) && !CPP_OPTION (pfile, c99))
cpp_error (pfile, CPP_DL_WARNING, cpp_error (pfile, CPP_DL_WARNING,
"universal character names are only valid in C++ and C99"); "universal character names are only valid in C++ and C99");
...@@ -1076,7 +1072,10 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, ...@@ -1076,7 +1072,10 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
break; break;
str++; str++;
if (loc_reader) if (loc_reader)
char_range->m_finish = loc_reader->get_next ().m_finish; {
gcc_assert (char_range);
char_range->m_finish = loc_reader->get_next ().m_finish;
}
result = (result << 4) + hex_value (c); result = (result << 4) + hex_value (c);
} }
while (--length && str < limit); while (--length && str < limit);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment