https://bugs.gentoo.org/904381 https://unicode-org.atlassian.net/browse/ICU-22356 https://github.com/unicode-org/icu/pull/2431 (what we originally applied) https://github.com/unicode-org/icu/pull/2432 (this commit) https://github.com/unicode-org/icu/commit/4fd9d6ce9a951e66e727b296138f22cd05479de1 From 4fd9d6ce9a951e66e727b296138f22cd05479de1 Mon Sep 17 00:00:00 2001 From: Fredrik Roubert Date: Tue, 18 Apr 2023 23:39:28 +0200 Subject: [PATCH] ICU-22356 Use ConstChar16Ptr to safely cast from UChar* to char16_t*. This is necessary for this header file to be usable by clients that define UCHAR_TYPE as a type not compatible with char16_t, eg. uint16_t. --- a/common/unicode/ures.h +++ b/common/unicode/ures.h @@ -25,6 +25,7 @@ #ifndef URES_H #define URES_H +#include "unicode/char16ptr.h" #include "unicode/utypes.h" #include "unicode/uloc.h" @@ -812,7 +813,7 @@ inline UnicodeString ures_getUnicodeString(const UResourceBundle *resB, UErrorCode* status) { UnicodeString result; int32_t len = 0; - const char16_t *r = ures_getString(resB, &len, status); + const char16_t *r = ConstChar16Ptr(ures_getString(resB, &len, status)); if(U_SUCCESS(*status)) { result.setTo(true, r, len); } else { @@ -837,7 +838,7 @@ inline UnicodeString ures_getNextUnicodeString(UResourceBundle *resB, const char ** key, UErrorCode* status) { UnicodeString result; int32_t len = 0; - const char16_t* r = ures_getNextString(resB, &len, key, status); + const char16_t* r = ConstChar16Ptr(ures_getNextString(resB, &len, key, status)); if(U_SUCCESS(*status)) { result.setTo(true, r, len); } else { @@ -859,7 +860,7 @@ inline UnicodeString ures_getUnicodeStringByIndex(const UResourceBundle *resB, int32_t indexS, UErrorCode* status) { UnicodeString result; int32_t len = 0; - const char16_t* r = ures_getStringByIndex(resB, indexS, &len, status); + const char16_t* r = ConstChar16Ptr(ures_getStringByIndex(resB, indexS, &len, status)); if(U_SUCCESS(*status)) { result.setTo(true, r, len); } else { @@ -882,7 +883,7 @@ inline UnicodeString ures_getUnicodeStringByKey(const UResourceBundle *resB, const char* key, UErrorCode* status) { UnicodeString result; int32_t len = 0; - const char16_t* r = ures_getStringByKey(resB, key, &len, status); + const char16_t* r = ConstChar16Ptr(ures_getStringByKey(resB, key, &len, status)); if(U_SUCCESS(*status)) { result.setTo(true, r, len); } else { --- a/test/intltest/Makefile.in +++ b/test/intltest/Makefile.in @@ -70,7 +70,7 @@ numbertest_parse.o numbertest_doubleconversion.o numbertest_skeletons.o \ static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o \ formattedvaluetest.o formatted_string_builder_test.o numbertest_permutation.o \ units_data_test.o units_router_test.o units_test.o displayoptions_test.o \ -numbertest_simple.o +numbertest_simple.o uchar_type_build_test.o DEPS = $(OBJECTS:.o=.d) --- /dev/null +++ b/test/intltest/uchar_type_build_test.cpp @@ -0,0 +1,7 @@ +// © 2023 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html#License + +// ICU-22356 Test that client code can be built with UCHAR_TYPE redefined. +#undef UCHAR_TYPE +#define UCHAR_TYPE uint16_t +#include "unicode/ures.h"