From 2ccf141631accfca3d512ac4b745c038086f841c Mon Sep 17 00:00:00 2001 From: Yoshito Umaoka Date: Fri, 11 Sep 2026 04:23:46 +0000 Subject: [PATCH] ICU-22779 Fixed ICU4C DataBuilderCollationIterator initialization order issue See #4111 --- icu4c/source/i18n/collationdatabuilder.cpp | 2 +- icu4c/source/i18n/collationiterator.h | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/icu4c/source/i18n/collationdatabuilder.cpp b/icu4c/source/i18n/collationdatabuilder.cpp index 5b5531307df2..27ae4d3cadc7 100644 --- a/icu4c/source/i18n/collationdatabuilder.cpp +++ b/icu4c/source/i18n/collationdatabuilder.cpp @@ -164,7 +164,7 @@ class DataBuilderCollationIterator : public CollationIterator { }; DataBuilderCollationIterator::DataBuilderCollationIterator(CollationDataBuilder &b) - : CollationIterator(&builderData, /*numeric=*/ false), + : CollationIterator(&builderData, /*nullTrie=*/ nullptr, /*numeric=*/ false), builder(b), builderData(b.nfcImpl), s(nullptr), pos(0) { builderData.base = builder.base; diff --git a/icu4c/source/i18n/collationiterator.h b/icu4c/source/i18n/collationiterator.h index 7e234c65b083..b99e9642ed43 100644 --- a/icu4c/source/i18n/collationiterator.h +++ b/icu4c/source/i18n/collationiterator.h @@ -212,6 +212,22 @@ class U_I18N_API_CLASS CollationIterator : public UObject { protected: CollationIterator(const CollationIterator &other); + /** + * A special constructor used by DataBuilderCollationIterator, which initializes + * the CollationData in the constructor. The public CollationIterator constructor + * initializes the trie pointer from the CollationData, but it's not yet available + * when DataBuilderCollationIterator invokes the CollationIterator constructor. + * The CollationData used by DataBuilderCollationIterator is the Normalizer2Impl, + * which does not have a trie, so the trie pointer is set to nullptr. + */ + CollationIterator(const CollationData *d, std::nullptr_t nullTrie, UBool numeric) + : trie(nullTrie), + data(d), + cesIndex(0), + skipped(nullptr), + numCpFwd(-1), + isNumeric(numeric) {} + void reset(); /**