diff options
author | David Tardon <dtardon@redhat.com> | 2017-11-12 18:46:48 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-11-17 00:17:04 +0100 |
commit | f643e1f687e27e7f46c53d7298772d4dddb3e660 (patch) | |
tree | 77cebb05db0f987d63b2363e95b5afefc9dec88e /external/icu | |
parent | 26ea47b7217053efb5eaa20f76b8895d29ae1f18 (diff) |
Upgrade to ICU 60.1
Change-Id: I07837be7faac0b2238b0cba8fb981e4c4d24c498
Diffstat (limited to 'external/icu')
-rw-r--r-- | external/icu/UnpackedTarball_icu.mk | 3 | ||||
-rw-r--r-- | external/icu/icu4c-59-icu13329-xlocale.patch.1 | 14 | ||||
-rw-r--r-- | external/icu/icu4c-59-werror-shadow.patch.1 | 42 | ||||
-rw-r--r-- | external/icu/icu4c-59-werror-undef.patch.1 | 13 | ||||
-rw-r--r-- | external/icu/icu4c-changeset-39671.patch.1 | 155 | ||||
-rw-r--r-- | external/icu/icu4c-changeset-40324.patch.1 | 11 | ||||
-rw-r--r-- | external/icu/icu4c-khmerbreakengine.patch.1 | 12 | ||||
-rw-r--r-- | external/icu/icu4c-ubsan.patch.1 | 80 |
8 files changed, 6 insertions, 324 deletions
diff --git a/external/icu/UnpackedTarball_icu.mk b/external/icu/UnpackedTarball_icu.mk index 7bf2926e5a83..499650976a55 100644 --- a/external/icu/UnpackedTarball_icu.mk +++ b/external/icu/UnpackedTarball_icu.mk @@ -34,10 +34,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,icu,\ external/icu/icu4c-clang-cl.patch.1 \ $(if $(filter-out ANDROID,$(OS)),external/icu/icu4c-icudata-stdlibs.patch.1) \ external/icu/icu4c-khmerbreakengine.patch.1 \ - external/icu/icu4c-59-werror-undef.patch.1 \ external/icu/icu4c-59-werror-shadow.patch.1 \ - external/icu/icu4c-59-icu13329-xlocale.patch.1 \ - external/icu/icu4c-changeset-40324.patch.1 \ )) $(eval $(call gb_UnpackedTarball_add_file,icu,source/data/brkitr/khmerdict.dict,external/icu/khmerdict.dict)) diff --git a/external/icu/icu4c-59-icu13329-xlocale.patch.1 b/external/icu/icu4c-59-icu13329-xlocale.patch.1 deleted file mode 100644 index 93e14d23fa5a..000000000000 --- a/external/icu/icu4c-59-icu13329-xlocale.patch.1 +++ /dev/null @@ -1,14 +0,0 @@ -# xlocale.h is gone with glibc 2.26 and should never had been included. -# https://ssl.icu-project.org/trac/ticket/13329 -diff -ur icu.org/source/i18n/digitlst.cpp icu/source/i18n/digitlst.cpp ---- icu.org/source/i18n/digitlst.cpp 2017-01-20 01:20:31.000000000 +0100 -+++ icu/source/i18n/digitlst.cpp 2017-09-13 13:25:59.980160603 +0200 -@@ -63,6 +63,8 @@ - #if U_USE_STRTOD_L - # if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_CYGWIN - # include <locale.h> -+# elif U_PLATFORM_IS_LINUX_BASED -+# include <ctype.h> // should be for all POSIX.2008 compliant platforms, but.. - # else - # include <xlocale.h> - # endif diff --git a/external/icu/icu4c-59-werror-shadow.patch.1 b/external/icu/icu4c-59-werror-shadow.patch.1 index 2031f80cb908..fb88244aff13 100644 --- a/external/icu/icu4c-59-werror-shadow.patch.1 +++ b/external/icu/icu4c-59-werror-shadow.patch.1 @@ -1,45 +1,3 @@ -diff -ur icu.org/source/common/unicode/char16ptr.h icu/source/common/unicode/char16ptr.h -# https://ssl.icu-project.org/trac/ticket/13176 ---- icu.org/source/common/unicode/char16ptr.h 2017-03-29 06:44:37.000000000 +0200 -+++ icu/source/common/unicode/char16ptr.h 2017-04-24 11:56:47.707572355 +0200 -@@ -107,14 +107,14 @@ - - #ifdef U_ALIASING_BARRIER - --Char16Ptr::Char16Ptr(char16_t *p) : p(p) {} -+Char16Ptr::Char16Ptr(char16_t *p_) : p(p_) {} - #if !U_CHAR16_IS_TYPEDEF --Char16Ptr::Char16Ptr(uint16_t *p) : p(cast(p)) {} -+Char16Ptr::Char16Ptr(uint16_t *p_) : p(cast(p_)) {} - #endif - #if U_SIZEOF_WCHAR_T==2 --Char16Ptr::Char16Ptr(wchar_t *p) : p(cast(p)) {} -+Char16Ptr::Char16Ptr(wchar_t *p_) : p(cast(p_)) {} - #endif --Char16Ptr::Char16Ptr(std::nullptr_t p) : p(p) {} -+Char16Ptr::Char16Ptr(std::nullptr_t p_) : p(p_) {} - Char16Ptr::~Char16Ptr() { - U_ALIASING_BARRIER(p); - } -@@ -215,14 +215,14 @@ - - #ifdef U_ALIASING_BARRIER - --ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p(p) {} -+ConstChar16Ptr::ConstChar16Ptr(const char16_t *p_) : p(p_) {} - #if !U_CHAR16_IS_TYPEDEF --ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p(cast(p)) {} -+ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p_) : p(cast(p_)) {} - #endif - #if U_SIZEOF_WCHAR_T==2 --ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p(cast(p)) {} -+ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p_) : p(cast(p_)) {} - #endif --ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p(p) {} -+ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p_) : p(p_) {} - ConstChar16Ptr::~ConstChar16Ptr() { - U_ALIASING_BARRIER(p); - } diff -ur icu.org/source/common/unicode/unistr.h icu/source/common/unicode/unistr.h --- icu.org/source/common/unicode/unistr.h 2017-03-29 06:44:37.000000000 +0200 +++ icu/source/common/unicode/unistr.h 2017-04-24 11:59:51.782076511 +0200 diff --git a/external/icu/icu4c-59-werror-undef.patch.1 b/external/icu/icu4c-59-werror-undef.patch.1 deleted file mode 100644 index 0792e7357257..000000000000 --- a/external/icu/icu4c-59-werror-undef.patch.1 +++ /dev/null @@ -1,13 +0,0 @@ -diff -ur icu.org/source/common/unicode/uvernum.h icu/source/common/unicode/uvernum.h -# https://ssl.icu-project.org/trac/ticket/13175 ---- icu.org/source/common/unicode/uvernum.h 2017-03-21 02:03:49.000000000 +0100 -+++ icu/source/common/unicode/uvernum.h 2017-04-21 23:44:55.123597927 +0200 -@@ -125,7 +125,7 @@ - * This value will change in the subsequent releases of ICU - * @stable ICU 2.6 - */ --#if U_PLATFORM_HAS_WINUWP_API == 0 -+#if !defined(U_PLATFORM_HAS_WINUWP_API) || (U_PLATFORM_HAS_WINUWP_API == 0) - #define U_ICU_VERSION_SHORT "59" - #else - // U_DISABLE_RENAMING does not impact dat file name diff --git a/external/icu/icu4c-changeset-39671.patch.1 b/external/icu/icu4c-changeset-39671.patch.1 deleted file mode 100644 index fa8d3679ebff..000000000000 --- a/external/icu/icu4c-changeset-39671.patch.1 +++ /dev/null @@ -1,155 +0,0 @@ -Index: /trunk/icu4c/source/common/utext.cpp -=================================================================== ---- icu.orig/source/common/utext.cpp -+++ icu/source/common/utext.cpp -@@ -848,7 +848,13 @@ - - // Chunk size. --// Must be less than 85, because of byte mapping from UChar indexes to native indexes. --// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes --// to two UChars.) -+// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes. -+// Worst case there are six UTF-8 bytes per UChar. -+// obsolete 6 byte form fd + 5 trails maps to fffd -+// obsolete 5 byte form fc + 4 trails maps to fffd -+// non-shortest 4 byte forms maps to fffd -+// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit -+// mapToUChars array size must allow for the worst case, 6. -+// This could be brought down to 4, by treating fd and fc as pure illegal, -+// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros. - // - enum { UTF8_TEXT_CHUNK_SIZE=32 }; -@@ -890,5 +896,5 @@ - // one for a supplementary starting in the last normal position, - // and one for an entry for the buffer limit position. -- uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to -+ uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to - // correspoding offset in filled part of buf. - int32_t align; -@@ -1033,4 +1039,5 @@ - u8b = (UTF8Buf *)ut->p; // the current buffer - mapIndex = ix - u8b->toUCharsMapStart; -+ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); - ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; - return TRUE; -@@ -1299,4 +1306,8 @@ - // If index is at the end, there is no character there to look at. - if (ix != ut->b) { -+ // Note: this function will only move the index back if it is on a trail byte -+ // and there is a preceding lead byte and the sequence from the lead -+ // through this trail could be part of a valid UTF-8 sequence -+ // Otherwise the index remains unchanged. - U8_SET_CP_START(s8, 0, ix); - } -@@ -1312,5 +1323,8 @@ - uint8_t *mapToNative = u8b->mapToNative; - uint8_t *mapToUChars = u8b->mapToUChars; -- int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1); -+ int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1; -+ // Note that toUCharsMapStart can be negative. Happens when the remaining -+ // text from current position to the beginning is less than the buffer size. -+ // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry. - int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region - // at end of buffer to leave room -@@ -1339,4 +1353,5 @@ - // Special case ASCII range for speed. - buf[destIx] = (UChar)c; -+ U_ASSERT(toUCharsMapStart <= srcIx); - mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx; - mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart); -@@ -1368,4 +1383,5 @@ - mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx; - } while (sIx >= srcIx); -+ U_ASSERT(toUCharsMapStart <= (srcIx+1)); - - // Set native indexing limit to be the current position. -@@ -1542,4 +1558,5 @@ - U_ASSERT(index<=ut->chunkNativeLimit); - int32_t mapIndex = index - u8b->toUCharsMapStart; -+ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); - int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; - U_ASSERT(offset>=0 && offset<=ut->chunkLength); -Index: /trunk/icu4c/source/test/intltest/utxttest.cpp -=================================================================== ---- icu.orig/source/test/intltest/utxttest.cpp -+++ icu/source/test/intltest/utxttest.cpp -@@ -68,4 +68,6 @@ - case 7: name = "Ticket12130"; - if (exec) Ticket12130(); break; -+ case 8: name = "Ticket12888"; -+ if (exec) Ticket12888(); break; - default: name = ""; break; - } -@@ -1584,2 +1586,62 @@ - utext_close(&ut); - } -+ -+// Ticket 12888: bad handling of illegal utf-8 containing many instances of the archaic, now illegal, -+// six byte utf-8 forms. Original implementation had an assumption that -+// there would be at most three utf-8 bytes per UTF-16 code unit. -+// The five and six byte sequences map to a single replacement character. -+ -+void UTextTest::Ticket12888() { -+ const char *badString = -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"; -+ -+ UErrorCode status = U_ZERO_ERROR; -+ LocalUTextPointer ut(utext_openUTF8(NULL, badString, -1, &status)); -+ TEST_SUCCESS(status); -+ for (;;) { -+ UChar32 c = utext_next32(ut.getAlias()); -+ if (c == U_SENTINEL) { -+ break; -+ } -+ } -+ int32_t endIdx = utext_getNativeIndex(ut.getAlias()); -+ if (endIdx != (int32_t)strlen(badString)) { -+ errln("%s:%d expected=%d, actual=%d", __FILE__, __LINE__, strlen(badString), endIdx); -+ return; -+ } -+ -+ for (int32_t prevIndex = endIdx; prevIndex>0;) { -+ UChar32 c = utext_previous32(ut.getAlias()); -+ int32_t currentIndex = utext_getNativeIndex(ut.getAlias()); -+ if (c != 0xfffd) { -+ errln("%s:%d (expected, actual, index) = (%d, %d, %d)\n", -+ __FILE__, __LINE__, 0xfffd, c, currentIndex); -+ break; -+ } -+ if (currentIndex != prevIndex - 6) { -+ errln("%s:%d: wrong index. Expected, actual = %d, %d", -+ __FILE__, __LINE__, prevIndex - 6, currentIndex); -+ break; -+ } -+ prevIndex = currentIndex; -+ } -+} -Index: /trunk/icu4c/source/test/intltest/utxttest.h -=================================================================== ---- icu.orig/source/test/intltest/utxttest.h -+++ icu/source/test/intltest/utxttest.h -@@ -39,4 +39,5 @@ - void Ticket10983(); - void Ticket12130(); -+ void Ticket12888(); - - private: diff --git a/external/icu/icu4c-changeset-40324.patch.1 b/external/icu/icu4c-changeset-40324.patch.1 deleted file mode 100644 index a651eb19415d..000000000000 --- a/external/icu/icu4c-changeset-40324.patch.1 +++ /dev/null @@ -1,11 +0,0 @@ -# https://ssl.icu-project.org/trac/changeset/40324/trunk/icu4c/source/i18n/zonemeta.cpp -Index: trunk/icu4c/source/i18n/zonemeta.cpp -=================================================================== ---- icu.orig/source/i18n/zonemeta.cpp -+++ icu/source/i18n/zonemeta.cpp -@@ -691,5 +691,4 @@ - if (U_FAILURE(status)) { - delete mzMappings; -- deleteOlsonToMetaMappingEntry(entry); - uprv_free(entry); - break; diff --git a/external/icu/icu4c-khmerbreakengine.patch.1 b/external/icu/icu4c-khmerbreakengine.patch.1 index 74f60f866257..6b45b3743611 100644 --- a/external/icu/icu4c-khmerbreakengine.patch.1 +++ b/external/icu/icu4c-khmerbreakengine.patch.1 @@ -310,7 +310,7 @@ diff -ur icu.org/source/common/dictbe.cpp icu/source/common/dictbe.cpp @@ -886,180 +1035,204 @@ int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { - if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) { - return 0; // Not enough characters for two words - } @@ -760,7 +760,7 @@ diff -ur icu.org/source/common/dictbe.h icu/source/common/dictbe.h * @param text A UText representing the text. The iterator is left at - * the end of the run of characters which the engine is capable of handling + * the end of the run of characters which the engine is capable of handling - * that starts from the first (or last) character in the range. + * that starts from the first character in the range. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. @@ -245,118 +306,120 @@ @@ -819,7 +819,7 @@ diff -ur icu.org/source/common/dictbe.h icu/source/common/dictbe.h - virtual int32_t divideUpDictionaryRange( UText *text, - int32_t rangeStart, - int32_t rangeEnd, -- UStack &foundBreaks ) const; +- UVector32 &foundBreaks ) const; - -}; - @@ -875,7 +875,7 @@ diff -ur icu.org/source/common/dictbe.h icu/source/common/dictbe.h - virtual int32_t divideUpDictionaryRange( UText *text, - int32_t rangeStart, - int32_t rangeEnd, -- UStack &foundBreaks ) const; +- UVector32 &foundBreaks ) const; - -}; - @@ -931,7 +931,7 @@ diff -ur icu.org/source/common/dictbe.h icu/source/common/dictbe.h + virtual int32_t divideUpDictionaryRange( UText *text, + int32_t rangeStart, + int32_t rangeEnd, -+ UStack &foundBreaks ) const; ++ UVector32 &foundBreaks ) const; + +}; + @@ -989,7 +989,7 @@ diff -ur icu.org/source/common/dictbe.h icu/source/common/dictbe.h + virtual int32_t divideUpDictionaryRange( UText *text, + int32_t rangeStart, + int32_t rangeEnd, -+ UStack &foundBreaks ) const; ++ UVector32 &foundBreaks ) const; + +}; + diff --git a/external/icu/icu4c-ubsan.patch.1 b/external/icu/icu4c-ubsan.patch.1 index 56594005e9d0..9f6aa3fbc9f8 100644 --- a/external/icu/icu4c-ubsan.patch.1 +++ b/external/icu/icu4c-ubsan.patch.1 @@ -65,18 +65,6 @@ diff -ur icu.org/source/common/ubidiimp.h icu/source/common/ubidiimp.h #define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT) #define GET_INDEX(x) ((x)&~INDEX_ODD_BIT) -diff -ur icu.org/source/common/ucharstriebuilder.cpp icu/source/common/ucharstriebuilder.cpp ---- icu.org/source/common/ucharstriebuilder.cpp 2017-02-03 19:57:23.000000000 +0100 -+++ icu/source/common/ucharstriebuilder.cpp 2017-04-21 22:46:25.375651159 +0200 -@@ -287,7 +287,7 @@ - - UCharsTrieBuilder::UCTLinearMatchNode::UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode) - : LinearMatchNode(len, nextNode), s(units) { -- hash=hash*37+ustr_hashUCharsN(units, len); -+ hash=hash*37U+ustr_hashUCharsN(units, len); - } - - UBool diff -ur icu.org/source/common/ucmndata.cpp icu/source/common/ucmndata.cpp --- icu.org/source/common/ucmndata.cpp 2017-03-08 16:34:47.000000000 +0100 +++ icu/source/common/ucmndata.cpp 2017-04-21 22:46:25.376651159 +0200 @@ -101,71 +89,3 @@ diff -ur icu.org/source/common/ucmndata.h icu/source/common/ucmndata.h } UDataOffsetTOC; /** -diff -ur icu.org/source/common/unicode/stringtriebuilder.h icu/source/common/unicode/stringtriebuilder.h ---- icu.org/source/common/unicode/stringtriebuilder.h 2017-03-10 23:01:34.000000000 +0100 -+++ icu/source/common/unicode/stringtriebuilder.h 2017-04-21 22:47:43.395634383 +0200 -@@ -276,7 +276,7 @@ - void setValue(int32_t v) { - hasValue=TRUE; - value=v; -- hash=hash*37+v; -+ hash=hash*37U+v; - } - protected: - UBool hasValue; -@@ -307,7 +307,7 @@ - class LinearMatchNode : public ValueNode { - public: - LinearMatchNode(int32_t len, Node *nextNode) -- : ValueNode((0x333333*37+len)*37+hashCode(nextNode)), -+ : ValueNode((0x333333U*37+len)*37+hashCode(nextNode)), - length(len), next(nextNode) {} - virtual UBool operator==(const Node &other) const; - virtual int32_t markRightEdgesFirst(int32_t edgeNumber); -@@ -342,7 +342,7 @@ - equal[length]=NULL; - values[length]=value; - ++length; -- hash=(hash*37+c)*37+value; -+ hash=(hash*37U+c)*37+value; - } - // Adds a unit which leads to another match node. - void add(int32_t c, Node *node) { -@@ -350,7 +350,7 @@ - equal[length]=node; - values[length]=0; - ++length; -- hash=(hash*37+c)*37+hashCode(node); -+ hash=(hash*37U+c)*37+hashCode(node); - } - protected: - Node *equal[kMaxBranchLinearSubNodeLength]; // NULL means "has final value". -@@ -365,7 +365,7 @@ - class SplitBranchNode : public BranchNode { - public: - SplitBranchNode(char16_t middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) -- : BranchNode(((0x555555*37+middleUnit)*37+ -+ : BranchNode(((0x555555U*37+middleUnit)*37+ - hashCode(lessThanNode))*37+hashCode(greaterOrEqualNode)), - unit(middleUnit), lessThan(lessThanNode), greaterOrEqual(greaterOrEqualNode) {} - virtual UBool operator==(const Node &other) const; -@@ -382,7 +382,7 @@ - class BranchHeadNode : public ValueNode { - public: - BranchHeadNode(int32_t len, Node *subNode) -- : ValueNode((0x666666*37+len)*37+hashCode(subNode)), -+ : ValueNode((0x666666U*37+len)*37+hashCode(subNode)), - length(len), next(subNode) {} - virtual UBool operator==(const Node &other) const; - virtual int32_t markRightEdgesFirst(int32_t edgeNumber); -diff -ur icu.org/source/i18n/collationdatareader.cpp icu/source/i18n/collationdatareader.cpp ---- icu.org/source/i18n/collationdatareader.cpp 2017-01-20 01:20:31.000000000 +0100 -+++ icu/source/i18n/collationdatareader.cpp 2017-04-21 22:46:25.380651158 +0200 -@@ -419,6 +419,7 @@ - tailoring.data, ts, fastLatinPrimaries, UPRV_LENGTHOF(fastLatinPrimaries)); - if(options == ts.options && ts.variableTop != 0 && - reorderCodesLength == ts.reorderCodesLength && -+ reorderCodesLength != 0 && - uprv_memcmp(reorderCodes, ts.reorderCodes, reorderCodesLength * 4) == 0 && - fastLatinOptions == ts.fastLatinOptions && - (fastLatinOptions < 0 || |