Commit 469b7b96e85 for php.net

commit 469b7b96e854ac51a0d04da9a99bf4e5e79af9f7
Merge: fa0e11f185f d8e741838a5
Author: Weilin Du <weilindu@php.net>
Date:   Tue Jun 16 21:21:50 2026 +0800

    Merge branch 'PHP-8.4' into PHP-8.5

diff --cc NEWS
index bd575259600,05bdd1b35ff..9159e3ecfdb
--- a/NEWS
+++ b/NEWS
@@@ -22,13 -24,28 +22,16 @@@ PH
  - GD:
    . Fixed bug GH-22121 (Double free in gdImageSetStyle() after
      overflow-triggered early return). (iliaal)
 -  . Fixed bug GH-19666 (imageconvolution() unexpected nan filter value).
 -    (David Carlier)
 -  . Fixed bug GH-19739 (imageellipse/imagefilledellipse overflow).
 -    (David Carlier)
 -  . Fixed bug GH-19730 (imageaffine overflow).
 -    (David Carlier)

  - Intl:
 -  . Fix incorrect argument positions for uninitialized calendar arguments in
 -    IntlCalendar::equals(), ::before(), ::after(), and ::isEquivalentTo(), and
 -    for invalid start/end arguments in transliterator_transliterate().
++  . Fix incorrect argument positions for invalid start/end arguments in
++    transliterator_transliterate().
+     (Weilin Du)
    . Fixed IntlTimeZone::getDisplayName() to synchronize object error state
      for invalid display types. (Weilin Du)
 -  . Fixed Spoofchecker restriction-level APIs to only be exposed with ICU 53
 -    and later. (Graham Campbell)
 -
 -- mysqli:
 -  . Fix stmt->query leak in mysqli_execute_query() validation errors.
 -    (David Carlier)

  - Opcache:
 +  . Fixed bug GH-22265 (Another tailcall vm_interrupt bug). (Levi Morrison)
    . Fixed bug GH-20469 (Unsafe inheritance cache replay with reentrant
      autoloading). (Levi Morrison)

diff --cc ext/intl/tests/transliterator_transliterate_error.phpt
index e11de9333d4,aefdd72b400..61190abc6d3
--- a/ext/intl/tests/transliterator_transliterate_error.phpt
+++ b/ext/intl/tests/transliterator_transliterate_error.phpt
@@@ -7,29 -5,54 +7,54 @@@ intl.use_exceptions=tru
  --FILE--
  <?php

 -ini_set("intl.error_level", E_WARNING);
 -
  $tr = Transliterator::create("latin");

- try {
- 	var_dump(transliterator_transliterate($tr, "str", 7));
- } catch (Throwable $e) {
- 	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
 -function dump_value_error(callable $callback): void {
++function dump_throwable(callable $callback): void {
+     try {
+         $callback();
 -    } catch (ValueError $exception) {
 -        echo $exception->getMessage() . "\n";
++    } catch (Throwable $e) {
++        echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+     }
  }

- try {
+ //Arguments
 -var_dump(transliterator_transliterate($tr,"str",7));
++dump_throwable(function() use ($tr) {
++    var_dump(transliterator_transliterate($tr, "str", 7));
++});
+
 -dump_value_error(function() use ($tr) {
 -    transliterator_transliterate($tr,"str",7,6);
++dump_throwable(function() use ($tr) {
 +    transliterator_transliterate($tr, "str", 7, 6);
- } catch (Throwable $e) {
- 	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
- }
+ });
+
 -dump_value_error(function() use ($tr) {
 -    transliterator_transliterate($tr,"str", 0, -2);
++dump_throwable(function() use ($tr) {
++    transliterator_transliterate($tr, "str", 0, -2);
+ });
+
 -dump_value_error(function() use ($tr) {
 -    transliterator_transliterate($tr,"str", -1);
++dump_throwable(function() use ($tr) {
++    transliterator_transliterate($tr, "str", -1);
+ });
+
 -dump_value_error(function() {
 -    transliterator_transliterate("latin","str", -1);
++dump_throwable(function() {
++    transliterator_transliterate("latin", "str", -1);
+ });
+
 -dump_value_error(function() use ($tr) {
++dump_throwable(function() use ($tr) {
+     $tr->transliterate("str", 7, 6);
+ });

  //bad UTF-8
 -transliterator_transliterate($tr, "\x80\x03");
 +try {
 +	transliterator_transliterate($tr, "\x80\x03");
 +} catch (Throwable $e) {
 +	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
 +}

 -echo "Done.\n";
  ?>
 ---EXPECTF--
 -Warning: transliterator_transliterate(): transliterator_transliterate: Neither "start" nor the "end" arguments can exceed the number of UTF-16 code units (in this case, 3) in %s on line %d
 -bool(false)
 -transliterator_transliterate(): Argument #3 ($start) must be less than or equal to argument #4 ($end)
 -transliterator_transliterate(): Argument #4 ($end) must be greater than or equal to -1
 -transliterator_transliterate(): Argument #3 ($start) must be greater than or equal to 0
 -transliterator_transliterate(): Argument #3 ($start) must be greater than or equal to 0
 -Transliterator::transliterate(): Argument #2 ($start) must be less than or equal to argument #3 ($end)
 -
 -Warning: transliterator_transliterate(): String conversion of string to UTF-16 failed in %s on line %d
 -Done.
 +--EXPECT--
 +IntlException: transliterator_transliterate(): Neither "start" nor the "end" arguments can exceed the number of UTF-16 code units (in this case, 3)
- ValueError: transliterator_transliterate(): Argument #2 ($string) must be less than or equal to argument #3 ($end)
++ValueError: transliterator_transliterate(): Argument #3 ($start) must be less than or equal to argument #4 ($end)
++ValueError: transliterator_transliterate(): Argument #4 ($end) must be greater than or equal to -1
++ValueError: transliterator_transliterate(): Argument #3 ($start) must be greater than or equal to 0
++ValueError: transliterator_transliterate(): Argument #3 ($start) must be greater than or equal to 0
++ValueError: Transliterator::transliterate(): Argument #2 ($start) must be less than or equal to argument #3 ($end)
 +IntlException: transliterator_transliterate(): String conversion of string to UTF-16 failed