From d37d2228353ff152245efde193f1fde0857ecaea Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikita.ppv@gmail.com>
Date: Wed, 9 Sep 2020 11:36:38 +0200
Subject: [PATCH] Make array_multisort() signature more variadic

The second and third arguments are not always the sort_order and
sort_flags -- they can also be in reverse order, or be arrays
altogether. Move them into the variadic parameter to avoid awkward
error messages.
---
 ...eflectionParameter_canBePassedByValue.phpt | 10 +---
 ext/standard/basic_functions.stub.php         | 10 ++--
 ext/standard/basic_functions_arginfo.h        |  6 +--
 .../tests/array/array_multisort_error.phpt    |  4 +-
 .../array/array_multisort_variation2.phpt     | 46 ++++++++---------
 .../array/array_multisort_variation3.phpt     | 50 +++++++++----------
 6 files changed, 56 insertions(+), 70 deletions(-)

diff --git a/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt b/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
index c5a7b72714..c7f823e423 100644
--- a/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
+++ b/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
@@ -41,15 +41,7 @@ Name: array1
 Is passed by reference: yes
 Can be passed by value: yes
 
-Name: sort_order
-Is passed by reference: yes
-Can be passed by value: yes
-
-Name: sort_flags
-Is passed by reference: yes
-Can be passed by value: yes
-
-Name: arrays
+Name: rest
 Is passed by reference: yes
 Can be passed by value: yes
 
diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php
index e9aa1b0c62..92406e22be 100755
--- a/ext/standard/basic_functions.stub.php
+++ b/ext/standard/basic_functions.stub.php
@@ -222,15 +222,11 @@ function array_udiff_uassoc(array $array, ...$rest): array {}
 
 /**
  * @param array $array1
- * @param int $sort_order
- * @param int $sort_flags
- * @param array $arrays
+ * @param array|int $rest
  * @prefer-ref $array1
- * @prefer-ref $sort_order
- * @prefer-ref $sort_flags
- * @prefer-ref $arrays
+ * @prefer-ref $rest
  */
-function array_multisort(&$array1, $sort_order = SORT_ASC, $sort_flags = SORT_REGULAR, &...$arrays): bool {}
+function array_multisort(&$array1, &...$rest): bool {}
 
 function array_rand(array $array, int $num_req = 1): int|string|array {}
 
diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h
index 46204d773b..fe4c07518c 100755
--- a/ext/standard/basic_functions_arginfo.h
+++ b/ext/standard/basic_functions_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 56f49d359d2b11383a3f1401d0a3730192c28fc0 */
+ * Stub hash: 251fc9f272492ab76c4a1a1dabcd768269cf1bde */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -313,9 +313,7 @@ ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_multisort, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, array1)
-	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(ZEND_SEND_PREFER_REF, sort_order, "SORT_ASC")
-	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(ZEND_SEND_PREFER_REF, sort_flags, "SORT_REGULAR")
-	ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, arrays)
+	ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, rest)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_array_rand, 0, 1, MAY_BE_LONG|MAY_BE_STRING|MAY_BE_ARRAY)
diff --git a/ext/standard/tests/array/array_multisort_error.phpt b/ext/standard/tests/array/array_multisort_error.phpt
index 6df4216337..4f2d979f71 100644
--- a/ext/standard/tests/array/array_multisort_error.phpt
+++ b/ext/standard/tests/array/array_multisort_error.phpt
@@ -25,7 +25,7 @@ try {
 *** Testing array_multisort() : error conditions ***
 
 -- Testing array_multisort() function with repeated flags --
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
+array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified
 
 -- Testing array_multisort() function with repeated flags --
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
+array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified
diff --git a/ext/standard/tests/array/array_multisort_variation2.phpt b/ext/standard/tests/array/array_multisort_variation2.phpt
index ff19956610..b491b87bfd 100644
--- a/ext/standard/tests/array/array_multisort_variation2.phpt
+++ b/ext/standard/tests/array/array_multisort_variation2.phpt
@@ -117,25 +117,25 @@ bool(true)
 bool(true)
 
 --int 12345--
-array_multisort(): Argument #2 ($sort_order) must be a valid sort flag
+array_multisort(): Argument #2 must be a valid sort flag
 
 --int -12345--
-array_multisort(): Argument #2 ($sort_order) must be a valid sort flag
+array_multisort(): Argument #2 must be a valid sort flag
 
 --float 10.5--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --float -10.5--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --float 12.3456789000e10--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --float -12.3456789000e10--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --float .5--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --empty array--
 Array sizes are inconsistent
@@ -150,49 +150,49 @@ bool(true)
 Array sizes are inconsistent
 
 --uppercase NULL--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --lowercase null--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --lowercase true--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --lowercase false--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --uppercase TRUE--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --uppercase FALSE--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --empty string DQ--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --empty string SQ--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --string DQ--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --string SQ--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --mixed case string--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --heredoc--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --instance of classWithToString--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --instance of classWithoutToString--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --undefined var--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
 
 --unset var--
-array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
+array_multisort(): Argument #2 must be an array or a sort flag
diff --git a/ext/standard/tests/array/array_multisort_variation3.phpt b/ext/standard/tests/array/array_multisort_variation3.phpt
index 891a9d9097..71f837acd8 100644
--- a/ext/standard/tests/array/array_multisort_variation3.phpt
+++ b/ext/standard/tests/array/array_multisort_variation3.phpt
@@ -103,76 +103,76 @@ foreach($inputs as $key =>$value) {
 *** Testing array_multisort() : usage variation ***
 
 --int 0--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
+array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified
 
 --int 1--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
+array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified
 
 --int 12345--
-array_multisort(): Argument #3 ($sort_flags) must be a valid sort flag
+array_multisort(): Argument #3 must be a valid sort flag
 
 --int -12345--
-array_multisort(): Argument #3 ($sort_flags) must be a valid sort flag
+array_multisort(): Argument #3 must be a valid sort flag
 
 --float 10.5--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --float -10.5--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --float 12.3456789000e10--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --float -12.3456789000e10--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --float .5--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --uppercase NULL--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --lowercase null--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --lowercase true--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --lowercase false--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --uppercase TRUE--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --uppercase FALSE--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --empty string DQ--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --empty string SQ--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --string DQ--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --string SQ--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --mixed case string--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --heredoc--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --instance of classWithToString--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --instance of classWithoutToString--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --undefined var--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
 
 --unset var--
-array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
+array_multisort(): Argument #3 must be an array or a sort flag
-- 
2.40.0