44 lines
1.8 KiB
Diff
44 lines
1.8 KiB
Diff
|
From 7045a80e08a5f662b9588ad9f0b8a5c1cd558bce Mon Sep 17 00:00:00 2001
|
||
|
From: Frank Tang <ftang@chromium.org>
|
||
|
Date: Fri, 5 Mar 2021 02:29:58 +0000
|
||
|
Subject: [PATCH] ICU-21521 Fix cast of uprv_strcmp
|
||
|
|
||
|
See #1618
|
||
|
[Update from guillaume: drop 1st hunk for backporting]
|
||
|
---
|
||
|
source/common/locid.cpp | 18 +++++++++++++++---
|
||
|
1 file changed, 15 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/source/common/locid.cpp b/source/common/locid.cpp
|
||
|
index 448c1de5e44..2d005b23542 100644
|
||
|
--- a/source/common/locid.cpp
|
||
|
+++ b/source/common/locid.cpp
|
||
|
@@ -1618,8 +1622,12 @@ AliasReplacer::outputToString(
|
||
|
out.append(SEP_CHAR, status);
|
||
|
}
|
||
|
variants.sort([](UElement e1, UElement e2) -> int8_t {
|
||
|
- return uprv_strcmp(
|
||
|
+ // uprv_strcmp return int and in some platform, such as arm64-v8a,
|
||
|
+ // it may return positive values > 127 which cause the casted value
|
||
|
+ // of int8_t negative.
|
||
|
+ int res = uprv_strcmp(
|
||
|
(const char*)e1.pointer, (const char*)e2.pointer);
|
||
|
+ return (res == 0) ? 0 : ((res > 0) ? 1 : -1);
|
||
|
}, status);
|
||
|
int32_t variantsStart = out.length();
|
||
|
for (int32_t i = 0; i < variants.size(); i++) {
|
||
|
@@ -1680,8 +1688,12 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status
|
||
|
|
||
|
// Sort the variants
|
||
|
variants.sort([](UElement e1, UElement e2) -> int8_t {
|
||
|
- return uprv_strcmp(
|
||
|
+ // uprv_strcmp return int and in some platform, such as arm64-v8a,
|
||
|
+ // it may return positive values > 127 which cause the casted value
|
||
|
+ // of int8_t negative.
|
||
|
+ int res = uprv_strcmp(
|
||
|
(const char*)e1.pointer, (const char*)e2.pointer);
|
||
|
+ return (res == 0) ? 0 : ((res > 0) ? 1 : -1);
|
||
|
}, status);
|
||
|
|
||
|
// A changed count to assert when loop too many times.
|