tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

icu 79.1 update



Hi!

I've locally updated icu to 79.1, and built bulk-test-icu on -current.
node needed a patch (from upstream via homebrew) for icu 79.

qt5-qtwebengine-5.15.19nb5 fails to build with an error similar to the
one in icu (in the v8 engine):

FAILED: [code=250] gen/v8/src/regexp/special-case.cc
python ../../3rdparty/chromium/v8/tools/run.py ./gen-regexp-special-case gen/v8/src/regexp/special-case.cc


#
# Fatal error in , line 0
# ignored
#
#
#
#FailureMessage Object: 0x7f7fff1464d0Return code is -6


I couldn't build gnuradio-core because bob complains:

gnuradio-core-3.10.12.0nb18  unresolved  No match found for dependency py315-qtgraph-qt5-[0-9]* of package gnuradio-core-3.10.12.0nb18

I also see this when I try building manually:

=> Returning to build of gnuradio-core-3.10.12.0nb18
=> Full dependency py315-qtgraph-qt5-[0-9]*: NOT found
=> Verifying bin-install for ../../x11/py-qtgraph-qt5
===> Binary install for py315-qtgraph-qt5-[0-9]*
=> Installing py315-qtgraph-qt5-[0-9]* from /usr/pkgsrc/packages/All
pkg_add: no pkg found for 'py315-qtgraph-qt5-[0-9]*', sorry.
pkg_add: 1 package addition failed
=> No binary package found for py315-qtgraph-qt5-[0-9]*; installing from source.
ERROR: [can-be-built-here.mk] This package has PKG_FAIL_REASON set:
ERROR: No valid Python version
*** Error code 1

My Python default is 3.15, but it should fall back to a supported
version; I don't understand this yet.

All other packages in bulk-test-icu bulk build built fine.

Anyone interested in helping out with qt5-qtwebengine?

Cheers,
 Thomas
? log
Index: Makefile
===================================================================
RCS file: /cvsroot/pkgsrc/textproc/icu/Makefile,v
retrieving revision 1.169
diff -u -r1.169 Makefile
--- Makefile	26 Mar 2026 05:41:37 -0000	1.169
+++ Makefile	28 Oct 2026 05:17:33 -0000
@@ -1,6 +1,6 @@
 # $NetBSD: Makefile,v 1.169 2026/03/26 05:41:37 adam Exp $
 
-DISTNAME=	icu4c-78.3-sources
+DISTNAME=	icu4c-79.1-sources
 PKGNAME=	${DISTNAME:S/4c//:S/-sources//}
 CATEGORIES=	textproc
 MASTER_SITES=	${MASTER_SITE_GITHUB:=unicode-org/}
Index: PLIST
===================================================================
RCS file: /cvsroot/pkgsrc/textproc/icu/PLIST,v
retrieving revision 1.62
diff -u -r1.62 PLIST
--- PLIST	6 Jan 2026 15:29:59 -0000	1.62
+++ PLIST	28 Oct 2026 05:17:33 -0000
@@ -224,27 +224,27 @@
 lib/libicudata.a
 lib/libicudata.so
 lib/libicudata.so.${PKGVERSION}
-lib/libicudata.so.78
+lib/libicudata.so.79
 lib/libicui18n.a
 lib/libicui18n.so
 lib/libicui18n.so.${PKGVERSION}
-lib/libicui18n.so.78
+lib/libicui18n.so.79
 lib/libicuio.a
 lib/libicuio.so
 lib/libicuio.so.${PKGVERSION}
-lib/libicuio.so.78
+lib/libicuio.so.79
 lib/libicutest.a
 lib/libicutest.so
 lib/libicutest.so.${PKGVERSION}
-lib/libicutest.so.78
+lib/libicutest.so.79
 lib/libicutu.a
 lib/libicutu.so
 lib/libicutu.so.${PKGVERSION}
-lib/libicutu.so.78
+lib/libicutu.so.79
 lib/libicuuc.a
 lib/libicuuc.so
 lib/libicuuc.so.${PKGVERSION}
-lib/libicuuc.so.78
+lib/libicuuc.so.79
 lib/pkgconfig/icu-i18n.pc
 lib/pkgconfig/icu-io.pc
 lib/pkgconfig/icu-uc.pc
Index: distinfo
===================================================================
RCS file: /cvsroot/pkgsrc/textproc/icu/distinfo,v
retrieving revision 1.113
diff -u -r1.113 distinfo
--- distinfo	26 Mar 2026 05:41:37 -0000	1.113
+++ distinfo	28 Oct 2026 05:17:33 -0000
@@ -1,24 +1,21 @@
 $NetBSD: distinfo,v 1.113 2026/03/26 05:41:37 adam Exp $
 
-BLAKE2s (icu4c-78.3-sources.tgz) = d363f07b8bd0d286c4874d594c4951278c4841ad6505b8d86a639a52285d20ed
-SHA512 (icu4c-78.3-sources.tgz) = 04a49455e1489030c520a4bfd2664fa2171e7938d08f2acdbbcb1fda976639fd8b1f0704f2eec89ba59a7b6d118ceaab6ec5a096e40d9085a0895d91ce225245
-Size (icu4c-78.3-sources.tgz) = 27977255 bytes
-SHA1 (patch-ICU-23263) = d73ce679198314744a61361774707be4b6470365
-SHA1 (patch-acinclude.m4) = 64311d903a85c868e3a87502ea58b916089afb70
+BLAKE2s (icu4c-79.1-sources.tgz) = 4c683f2ddbc398ef3d0a16a42fef062f45fdb9ebd9ffe0e095ca49a1dde4f07f
+SHA512 (icu4c-79.1-sources.tgz) = 9098adf9ba7fbe11d92963415cc80bf09de39ce1372414dbc2561e5f8ef57479a9fe4b6f7abc61911e4659e5953be987c459297d29e61b064d1931a16195a973
+Size (icu4c-79.1-sources.tgz) = 28162455 bytes
+SHA1 (patch-acinclude.m4) = 59da54f9a8b324406f8fbff5baddc3549a14c8ae
 SHA1 (patch-common_putil.cpp) = cc867aaef753c23ff12db019e41836c0dd5ac6d1
-SHA1 (patch-common_ubidiimp.h) = 180eb1fe1069c393ddf1deb46da00f466d8438e8
 SHA1 (patch-common_umutex.h) = b22b7c02b4645a87f71d54885d858d0cf9005988
 SHA1 (patch-common_unicode_platform.h) = 8b7b8bcf6f5185225a1ca516ac212a495f7b47e8
 SHA1 (patch-common_unicode_ptypes.h) = b0fd74429b217580d1957c241b9c7a187a00f8c3
-SHA1 (patch-common_uposixdefs.h) = 2900a3747b49bcf1a81dbb5a20692c120f28cb04
+SHA1 (patch-common_uposixdefs.h) = 968f8b492da6165bbe9db778018f403b09bf6764
 SHA1 (patch-config_Makefile.inc.in) = e7cee161315321d2580074054d87714b55319886
 SHA1 (patch-config_icu-config-bottom) = 168b89ee9180d4ae545125866ee91eb004010501
 SHA1 (patch-config_mh-darwin) = 4fd2c664b23078692b61557ebb66693712d333cd
 SHA1 (patch-config_mh-scoosr5) = 47703dcc184f58c0382da3225f849424ab74d472
-SHA1 (patch-configure) = d490321c93d67f7d3a70319ce8a86ca36fd3825c
+SHA1 (patch-configure) = 9b052e09363705027e90b45d56996559d3c3d759
 SHA1 (patch-configure.ac) = 86f4b142afddb9784f2aec98f147ee29217b6124
 SHA1 (patch-i18n_double-conversion-utils.h) = 9bee115bb9ddc597607e30f95050de7b21751fca
-SHA1 (patch-i18n_measunit_extra.cpp) = 3e755b2da38345a658905fb32cbedbefa5414183
 SHA1 (patch-icudefs.mk.in) = 15be482cf7541c9b518b8bfb05865ac994313cb7
 SHA1 (patch-runConfigureICU) = 6aa0de86506440aeb13005959e9014a53ed63036
 SHA1 (patch-tools-toolutil-pkg_genc.cpp) = 3cbcf3387d6a39315b26a3e2a2ffb715507e9110
Index: patches/patch-ICU-23263
===================================================================
RCS file: patches/patch-ICU-23263
diff -N patches/patch-ICU-23263
--- patches/patch-ICU-23263	6 Jan 2026 15:29:59 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,63 +0,0 @@
-$NetBSD: patch-ICU-23263,v 1.1 2026/01/06 15:29:59 ryoon Exp $
-
-ICU-23263 Support shared/static data library that uses a pointer based table of contents
-
-Upstream fix: aa17de1994d188560d99d07c37bf333416483899
-
-diff --git a/icu4c/source/common/ucnv_io.cpp b/icu4c/source/common/ucnv_io.cpp
-index 46a26f821fd8..66813f5a0372 100644
---- common/ucnv_io.cpp
-+++ common/ucnv_io.cpp
-@@ -249,14 +249,15 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) {
- 
-     sectionSizes = static_cast<const uint32_t*>(udata_getMemory(data));
-     int32_t dataLength = udata_getLength(data); // This is the length minus the UDataInfo size
--    if (dataLength <= int32_t(sizeof(sectionSizes[0]))) {
-+    UBool isDataLengthKnown = dataLength >= 0; // Only false when using a pointer table of contents (not files nor a common data archive)
-+    if (isDataLengthKnown && dataLength <= int32_t(sizeof(sectionSizes[0]))) {
-         // We don't even have a TOC!
-         goto invalidFormat;
-     }
-     table = reinterpret_cast<const uint16_t*>(sectionSizes);
-     tableStart = sectionSizes[0];
-     sizeOfTOC = int32_t((tableStart + 1) * sizeof(sectionSizes[0]));
--    if (tableStart < minTocLength || dataLength <= sizeOfTOC) {
-+    if (tableStart < minTocLength || (isDataLengthKnown && dataLength <= sizeOfTOC)) {
-         // We don't have a whole TOC!
-         goto invalidFormat;
-     }
-@@ -279,7 +280,7 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) {
-     for (uint32_t section = 1; section <= tableStart; section++) {
-         sizeOfData += sectionSizes[section] * sizeof(table[0]);
-     }
--    if (dataLength < sizeOfData) {
-+    if (isDataLengthKnown && dataLength < sizeOfData) {
-         // Truncated file!
-         goto invalidFormat;
-     }
-diff --git a/icu4c/source/configure b/icu4c/source/configure
-index 033749b71bc9..1fd03e78f6f9 100755
---- configure
-+++ configure
-@@ -7013,7 +7013,7 @@ case "${host}" in
-         # We're using gcc, and the simple -a gcc command line works for genccode
-         GENCCODE_ASSEMBLY="-a gcc"
-     fi ;;
--i*86-*-solaris*)
-+*86*-solaris*)
-     if test "$GCC" = yes; then
-         # When using gcc, look if we're also using GNU as.
-         # When using GNU as, the simple -a gcc command line works for genccode.
-diff --git a/icu4c/source/configure.ac b/icu4c/source/configure.ac
-index 8ffacf8795a9..61e7ee47fcc6 100644
---- configure.ac
-+++ configure.ac
-@@ -618,7 +618,7 @@ case "${host}" in
-         # We're using gcc, and the simple -a gcc command line works for genccode
-         GENCCODE_ASSEMBLY="-a gcc"
-     fi ;;
--i*86-*-solaris*)
-+*86*-solaris*)
-     if test "$GCC" = yes; then
-         # When using gcc, look if we're also using GNU as.
-         # When using GNU as, the simple -a gcc command line works for genccode.
Index: patches/patch-acinclude.m4
===================================================================
RCS file: /cvsroot/pkgsrc/textproc/icu/patches/patch-acinclude.m4,v
retrieving revision 1.5
diff -u -r1.5 patch-acinclude.m4
--- patches/patch-acinclude.m4	30 Mar 2025 21:10:47 -0000	1.5
+++ patches/patch-acinclude.m4	28 Oct 2026 05:17:33 -0000
@@ -2,13 +2,13 @@
 
 Solaris seems to need -std=c99 with recent pkgsrc so keep it.
 
---- acinclude.m4.orig	Fri Mar 27 21:17:48 2015
+--- acinclude.m4.orig	2026-10-22 15:02:04.000000000 +0000
 +++ acinclude.m4
-@@ -82,6 +82,7 @@ x86_64-*-cygwin) 
+@@ -85,6 +85,7 @@ powerpc*-apple-darwin*)	icu_cv_host_frag=mh-darwin-ppc
  *-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;;
  *-*-nto*)	icu_cv_host_frag=mh-qnx ;;
  *-ncr-*)	icu_cv_host_frag=mh-mpras ;;
 +*-*-sco3.2v5*)	icu_cv_host_frag=mh-scoosr5 ;;
+ *-wasi*)	icu_cv_host_frag=mh-wasi ;;
  *) 		icu_cv_host_frag=mh-unknown ;;
  esac
- 		]
Index: patches/patch-common_ubidiimp.h
===================================================================
RCS file: patches/patch-common_ubidiimp.h
diff -N patches/patch-common_ubidiimp.h
--- patches/patch-common_ubidiimp.h	5 Nov 2020 08:58:41 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,18 +0,0 @@
-$NetBSD: patch-common_ubidiimp.h,v 1.2 2020/11/05 08:58:41 ryoon Exp $
-
-Avoid sys/regset.h pollution on SunOS.
-
---- common/ubidiimp.h.orig	2020-10-28 21:21:12.000000000 +0000
-+++ common/ubidiimp.h
-@@ -24,6 +24,11 @@
- #include "unicode/uchar.h"
- #include "ubidi_props.h"
- 
-+#ifdef __sun
-+#undef CS
-+#undef ES
-+#endif
-+
- /* miscellaneous definitions ---------------------------------------------- */
- 
- // ICU-20853=ICU-20935 Solaris #defines CS and ES in sys/regset.h
Index: patches/patch-common_uposixdefs.h
===================================================================
RCS file: /cvsroot/pkgsrc/textproc/icu/patches/patch-common_uposixdefs.h,v
retrieving revision 1.7
diff -u -r1.7 patch-common_uposixdefs.h
--- patches/patch-common_uposixdefs.h	19 Apr 2023 08:06:31 -0000	1.7
+++ patches/patch-common_uposixdefs.h	28 Oct 2026 05:17:33 -0000
@@ -3,7 +3,7 @@
 C99 and related define overrides.
 Do not play _XOPEN_SOURCE games on NetBSD, as it breaks at least gcc 6.4 on NetBSD-8.0
 
---- common/uposixdefs.h.orig	2023-04-13 21:41:15.000000000 +0000
+--- common/uposixdefs.h.orig	2026-10-22 15:02:04.000000000 +0000
 +++ common/uposixdefs.h
 @@ -44,8 +44,10 @@
       * and define _XOPEN_SOURCE to different values depending on __STDC_VERSION__.
@@ -16,15 +16,14 @@
  
  /*
   * Make sure things like realpath and such functions work.
-@@ -54,9 +56,11 @@
+@@ -54,8 +56,10 @@
   *
   * z/OS needs this definition for timeval and to get usleep.
   */
 +#if !defined(__sun) && !defined(_SCO_DS)
  #if !defined(_XOPEN_SOURCE_EXTENDED) && defined(__TOS_MVS__)
  #   define _XOPEN_SOURCE_EXTENDED 1
- #endif
 +#endif
+ #endif
  
  /**
-  * Solaris says:
Index: patches/patch-configure
===================================================================
RCS file: /cvsroot/pkgsrc/textproc/icu/patches/patch-configure,v
retrieving revision 1.15
diff -u -r1.15 patch-configure
--- patches/patch-configure	30 Mar 2025 21:10:47 -0000	1.15
+++ patches/patch-configure	28 Oct 2026 05:17:33 -0000
@@ -3,20 +3,21 @@
 Portability fix.
 Solaris seems to need -std=c99 with recent pkgsrc so keep it.
 
---- configure.orig	2024-10-24 18:24:00.000000000 +0000
+--- configure.orig	2026-10-22 15:02:04.000000000 +0000
 +++ configure
-@@ -5884,6 +5884,7 @@ powerpc*-apple-darwin*)	icu_cv_host_frag
+@@ -5833,6 +5833,7 @@ powerpc*-apple-darwin*)	icu_cv_host_frag=mh-darwin-ppc
  *-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;;
  *-*-nto*)	icu_cv_host_frag=mh-qnx ;;
  *-ncr-*)	icu_cv_host_frag=mh-mpras ;;
 +-*-sco3.2v5*)	icu_cv_host_frag=mh-scoosr5 ;;
+ *-wasi*)	icu_cv_host_frag=mh-wasi ;;
  *) 		icu_cv_host_frag=mh-unknown ;;
  esac
- 
-@@ -6511,6 +6512,29 @@ if test "x$plugins" = "xtrue"; then
+@@ -6460,6 +6461,29 @@ fi
+    UCONFIG_CPPFLAGS="$UCONFIG_CPPFLAGS -DUCONFIG_ENABLE_PLUGINS=1"
  fi
  
- 
++
 +# check if sys/atomic.h is present.
 +for ac_header in sys/atomic.h
 +do :
@@ -39,7 +40,6 @@
 +*)
 +;;
 +esac
-+
+ 
  U_ENABLE_DYLOAD=1
  enable=yes
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable dynamic loading of plugins. Ignored if plugins disabled." >&5
Index: distinfo
===================================================================
RCS file: /cvsroot/pkgsrc/lang/nodejs/distinfo,v
retrieving revision 1.336
diff -u -r1.336 distinfo
--- distinfo	22 Oct 2026 11:08:12 -0000	1.336
+++ distinfo	28 Oct 2026 05:18:04 -0000
@@ -15,6 +15,9 @@
 SHA1 (patch-deps_v8_src_base_strings.h) = 4d2b37491f2f74f1a573f8c1942790204e23a8bb
 SHA1 (patch-deps_v8_src_codegen_arm_cpu-arm.cc) = 84c75d61bc99c2ff9adeac3152f5b11ebb0e582b
 SHA1 (patch-deps_v8_src_common_globals.h) = 86637724864389f2b24251904de41669a2f00fbc
+SHA1 (patch-deps_v8_src_regexp_gen-regexp-special-case.cc) = e96996cfc6171cebeabd0a887739df7888fd3e73
+SHA1 (patch-deps_v8_src_regexp_regexp-parser.cc) = b00e8184f51496798b9da8b28b0e31289bfc3693
+SHA1 (patch-deps_v8_src_regexp_special-case.h) = bdea3389166d7f5ef2ad45dffabc067429278e0b
 SHA1 (patch-deps_v8_src_strings_string-hasher.cc) = 655d497ba45c073b79527b3733ecff4e6aab8ddf
 SHA1 (patch-deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc) = ccca21704265f98801bb97968b51c1432136b556
 SHA1 (patch-deps_v8_tools_profiling_run-llprof.sh) = b19994d3195cc97424a3cc2ffd3ae02eacc6ffa8
Index: patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc
===================================================================
RCS file: patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc
diff -N patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc	28 Oct 2026 05:18:04 -0000
@@ -0,0 +1,103 @@
+$NetBSD$
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/gen-regexp-special-case.cc.orig	2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/gen-regexp-special-case.cc
+@@ -9,6 +9,7 @@
+ 
+ #include "src/base/strings.h"
+ #include "src/regexp/special-case.h"
++#include "unicode/uchar.h"
+ 
+ namespace v8 {
+ namespace internal {
+@@ -17,6 +18,19 @@ static const base::uc32 kNonBmpStart = 0x10000;
+ static const base::uc32 kSurrogateEnd = 0xdfff;
+ static const base::uc32 kNonBmpStart = 0x10000;
+ 
++// Removes supplementary code points from |set| and returns whether any were
++// present. Since Unicode 18, the case closure of a BMP character can contain
++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH
++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode
++// ignoreCase matching compares UTF-16 code units, so a supplementary code
++// point never matches a BMP character and does not take part in Canonicalize.
++bool RemoveSupplementary(icu::UnicodeSet& set) {
++  constexpr UChar32 kFirstSupplementary = static_cast<UChar32>(kNonBmpStart);
++  if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false;
++  set.remove(kFirstSupplementary, UCHAR_MAX_VALUE);
++  return true;
++}
++
+ // The following code generates "src/regexp/special-case.cc".
+ void PrintSet(std::ofstream& out, const char* name,
+               const icu::UnicodeSet& set) {
+@@ -51,6 +65,7 @@ void PrintSpecial(std::ofstream& out) {
+   icu::UnicodeSet current;
+   icu::UnicodeSet special_add;
+   icu::UnicodeSet ignore;
++  icu::UnicodeSet supplementary_equivalents;
+   UErrorCode status = U_ZERO_ERROR;
+   icu::UnicodeSet upper("[\\p{Lu}]", status);
+   CHECK(U_SUCCESS(status));
+@@ -63,6 +78,7 @@ void PrintSpecial(std::ofstream& out) {
+     }
+     current.set(i, i);
+     current.closeOver(USET_CASE_INSENSITIVE);
++    if (RemoveSupplementary(current)) supplementary_equivalents.add(i);
+ 
+     // Check to see if all characters in the case-folding equivalence
+     // class as defined by UnicodeSet::closeOver all map to the same
+@@ -112,6 +128,7 @@ void PrintSpecial(std::ofstream& out) {
+       UChar32 canonical = RegExpCaseFolding::Canonicalize(c);
+       current.set(c, c);
+       current.closeOver(USET_CASE_INSENSITIVE);
++      RemoveSupplementary(current);
+       current.removeAll(ignore);
+       for (int32_t j = 0; j < current.getRangeCount(); j++) {
+         for (UChar32 c2 = current.getRangeStart(j);
+@@ -124,6 +141,7 @@ void PrintSpecial(std::ofstream& out) {
+ 
+   PrintSet(out, "IgnoreSet", ignore);
+   PrintSet(out, "SpecialAddSet", special_add);
++  PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents);
+ }
+ 
+ void WriteHeader(const char* header_filename) {
Index: patches/patch-deps_v8_src_regexp_regexp-parser.cc
===================================================================
RCS file: patches/patch-deps_v8_src_regexp_regexp-parser.cc
diff -N patches/patch-deps_v8_src_regexp_regexp-parser.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-deps_v8_src_regexp_regexp-parser.cc	28 Oct 2026 05:18:04 -0000
@@ -0,0 +1,86 @@
+$NetBSD$
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/regexp-parser.cc.orig	2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/regexp-parser.cc
+@@ -10,6 +10,7 @@
+ #include "src/regexp/regexp-ast.h"
+ #include "src/regexp/regexp-macro-assembler.h"
+ #include "src/regexp/regexp.h"
++#include "src/regexp/special-case.h"
+ #include "src/strings/char-predicates-inl.h"
+ #include "src/utils/ostreams.h"
+ #include "src/utils/utils.h"
+@@ -156,6 +157,10 @@ void RegExpTextBuilder::AddCharacter(base::uc16 c) {
+ 
+ void RegExpTextBuilder::AddCharacter(base::uc16 c) {
+   FlushPendingSurrogate();
++  if (NeedsDesugaringForIgnoreCase(c)) {
++    AddClassRangesForDesugaring(c);
++    return;
++  }
+   if (characters_ == nullptr) {
+     characters_ = zone()->New<ZoneList<base::uc16>>(4, zone());
+   }
+@@ -238,15 +243,18 @@ bool RegExpTextBuilder::NeedsDesugaringForUnicode(RegE
+   return false;
+ }
+ 
+-// We only use this for characters made of surrogate pairs.  All other
+-// characters outside of character classes are made case independent in the
+-// code generation.
++// Desugar supplementary characters with case equivalents and BMP characters
++// with supplementary equivalents. Other atoms are folded during code
++// generation.
+ bool RegExpTextBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) {
+ #ifdef V8_INTL_SUPPORT
+   if (IsUnicodeMode() && ignore_case()) {
++    if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) {
++      return RegExpCaseFolding::HasSupplementaryEquivalents(
++          static_cast<base::uc16>(c));
++    }
+     icu::UnicodeSet set(c, c);
+-    set.closeOver(USET_CASE_INSENSITIVE);
+-    set.removeAllStrings();
++    RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode);
+     return set.size() > 1;
+   }
+   // In the case where ICU is not included, we act as if the unicode flag is
Index: patches/patch-deps_v8_src_regexp_special-case.h
===================================================================
RCS file: patches/patch-deps_v8_src_regexp_special-case.h
diff -N patches/patch-deps_v8_src_regexp_special-case.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-deps_v8_src_regexp_special-case.h	28 Oct 2026 05:18:04 -0000
@@ -0,0 +1,115 @@
+$NetBSD$
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/special-case.h.orig	2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/special-case.h
+@@ -7,8 +7,8 @@
+ 
+ #ifdef V8_INTL_SUPPORT
+ #include "src/base/logging.h"
++#include "src/base/strings.h"
+ #include "src/common/globals.h"
+-
+ #include "unicode/uchar.h"
+ #include "unicode/uniset.h"
+ #include "unicode/unistr.h"
+@@ -71,9 +71,17 @@ namespace internal {
+ // another character. Characters that match no other characters in
+ // their equivalence class are added to IgnoreSet. Characters that
+ // match at least one other character are added to SpecialAddSet.
++// Supplementary code points are ignored throughout: non-unicode matching
++// compares UTF-16 code units, so they can never match a BMP character.
++//
++// The generator additionally emits SupplementaryEquivalentsSet, the BMP
++// characters whose Unicode case closure contains supplementary code points.
++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents.
+ 
+ class RegExpCaseFolding final : public AllStatic {
+  public:
++  enum class Mode { kNonUnicode, kUnicode };
++
+   static const icu::UnicodeSet& IgnoreSet();
+   static const icu::UnicodeSet& SpecialAddSet();
+ 
+@@ -107,6 +115,43 @@ class RegExpCaseFolding final : public AllStatic {
+ 
+     // h. Return cu.
+     return cu;
++  }
++
++  // Close a set of characters under case equivalence, preserving its
++  // original members. Non-unicode inputs must be UTF-16 code units.
++  static void CloseOver(icu::UnicodeSet& set, Mode mode) {
++    if (mode == Mode::kUnicode) {
++      set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++      return;
++    }
++    DCHECK(!set.containsSome(0x10000, 0x10ffff));
++    if (IgnoreSet().containsNone(set)) {
++      CloseOverNonUnicode(set);
++      return;
++    }
++    if (IgnoreSet().containsAll(set)) return;
++    // Ignored characters neither contribute nor acquire equivalents, but
++    // must remain in the result if they were explicitly present.
++    icu::UnicodeSet ignored(set);
++    ignored.retainAll(IgnoreSet());
++    set.removeAll(IgnoreSet());
++    CloseOverNonUnicode(set);
++    set.addAll(ignored);
++  }
++
++  // Whether c has supplementary Unicode case equivalents.
++  static bool HasSupplementaryEquivalents(base::uc16 c) {
++    return SupplementaryEquivalentsSet().contains(c);
++  }
++
++ private:
++  static const icu::UnicodeSet& SupplementaryEquivalentsSet();
++
++  // Requires a set containing no IgnoreSet characters.
++  static void CloseOverNonUnicode(icu::UnicodeSet& set) {
++    set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++    set.removeAll(IgnoreSet());
++    set.remove(0x10000, 0x10ffff);
+   }
+ };
+ 


Home | Main Index | Thread Index | Old Index