Fix crash in selftest::test_lexer_string_locations_ucn4 (PR bootstrap/72823)
authorDavid Malcolm <dmalcolm@redhat.com>
Sat, 6 Aug 2016 18:06:30 +0000 (18:06 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Sat, 6 Aug 2016 18:06:30 +0000 (18:06 +0000)
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

libcpp/ChangeLog
libcpp/charset.c

index 3a530b7133af7c1fd5744eb3e6d1502d18fcebed..f7cc1c410fa4736eea91c645712a2f10203ef8da 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        * charset.c (cpp_substring_ranges::cpp_substring_ranges): New
index 3739d6ca034b2ff51e0d3e4fe1da446578a517b0..6a92ade272a101fc0d76cac2039bc9cecf3aebaf 100644 (file)
@@ -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
    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.  */
 
 bool
@@ -1042,10 +1042,6 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
   const uchar *str = *pstr;
   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))
     cpp_error (pfile, CPP_DL_WARNING,
               "universal character names are only valid in C++ and C99");
@@ -1076,7 +1072,10 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
        break;
       str++;
       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);
     }
   while (--length && str < limit);