testsuite: get a predictable ordered array for comparison

Message ID 20260407124122.2810562-1-torbjorn.svensson@foss.st.com
State New
Headers
Series testsuite: get a predictable ordered array for comparison |

Commit Message

Torbjörn SVENSSON April 7, 2026, 12:41 p.m. UTC
  Ok for trunk and releases/gcc-15?

--

Without this patch, errors like below can be seen in g++.log:

Traceback (most recent call last):
  File "/build/gcc_src/gcc/testsuite/g++.dg/modules/test-p1689.py", line 220, in <module>
    is_ok = validate_p1689(actual, expect)
...
  File "/build/gcc_src/gcc/testsuite/g++.dg/modules/test-p1689.py", line 149, in compare_json
    actual = set(actual)
TypeError: unhashable type: 'dict'

To avoid hashing dicts, transform the elements to string representation
prior to sorting the array and then transform back to objects after.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/test-p1689.py: Make arrays have predictable
	order.

Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
---
 gcc/testsuite/g++.dg/modules/test-p1689.py | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
  

Comments

Torbjörn SVENSSON April 14, 2026, 6:42 a.m. UTC | #1
Gentle ping! :)

Kind regards,
Torbjörn

On 2026-04-07 14:41, Torbjörn SVENSSON wrote:
> Ok for trunk and releases/gcc-15?
> 
> --
> 
> Without this patch, errors like below can be seen in g++.log:
> 
> Traceback (most recent call last):
>    File "/build/gcc_src/gcc/testsuite/g++.dg/modules/test-p1689.py", line 220, in <module>
>      is_ok = validate_p1689(actual, expect)
> ...
>    File "/build/gcc_src/gcc/testsuite/g++.dg/modules/test-p1689.py", line 149, in compare_json
>      actual = set(actual)
> TypeError: unhashable type: 'dict'
> 
> To avoid hashing dicts, transform the elements to string representation
> prior to sorting the array and then transform back to objects after.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/modules/test-p1689.py: Make arrays have predictable
> 	order.
> 
> Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
> ---
>   gcc/testsuite/g++.dg/modules/test-p1689.py | 14 ++++++++++++--
>   1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/testsuite/g++.dg/modules/test-p1689.py b/gcc/testsuite/g++.dg/modules/test-p1689.py
> index 2f07cc361aa..b9cb3ebfc32 100644
> --- a/gcc/testsuite/g++.dg/modules/test-p1689.py
> +++ b/gcc/testsuite/g++.dg/modules/test-p1689.py
> @@ -131,6 +131,16 @@ def _inspect_ordering(arr):
>   
>       return arr, req_ordering
>   
> +def _get_predictable_ordered_array(arr):
> +    if not arr:
> +        return arr
> +
> +    # Convert to list of string to get predictable order.
> +    # Using set() here causes issue with complex arrays
> +    arr = [json.dumps(x) for x in arr]
> +    arr.sort()
> +    return [json.loads(x) for x in arr]
> +
>   
>   def compare_json(path, actual, expect):
>       actual_type = type(actual)
> @@ -146,8 +156,8 @@ def compare_json(path, actual, expect):
>       elif actual_type == list:
>           expect, req_ordering = _inspect_ordering(expect)
>           if not req_ordering:
> -            actual = set(actual)
> -            expect = set(expect)
> +            actual = _get_predictable_ordered_array(actual)
> +            expect = _get_predictable_ordered_array(expect)
>           is_ok = _compare_array(path, actual, expect)
>       elif actual_type == str:
>           is_ok = _compare_string(path, actual, expect)
  

Patch

diff --git a/gcc/testsuite/g++.dg/modules/test-p1689.py b/gcc/testsuite/g++.dg/modules/test-p1689.py
index 2f07cc361aa..b9cb3ebfc32 100644
--- a/gcc/testsuite/g++.dg/modules/test-p1689.py
+++ b/gcc/testsuite/g++.dg/modules/test-p1689.py
@@ -131,6 +131,16 @@  def _inspect_ordering(arr):
 
     return arr, req_ordering
 
+def _get_predictable_ordered_array(arr):
+    if not arr:
+        return arr
+
+    # Convert to list of string to get predictable order.
+    # Using set() here causes issue with complex arrays
+    arr = [json.dumps(x) for x in arr]
+    arr.sort()
+    return [json.loads(x) for x in arr]
+
 
 def compare_json(path, actual, expect):
     actual_type = type(actual)
@@ -146,8 +156,8 @@  def compare_json(path, actual, expect):
     elif actual_type == list:
         expect, req_ordering = _inspect_ordering(expect)
         if not req_ordering:
-            actual = set(actual)
-            expect = set(expect)
+            actual = _get_predictable_ordered_array(actual)
+            expect = _get_predictable_ordered_array(expect)
         is_ok = _compare_array(path, actual, expect)
     elif actual_type == str:
         is_ok = _compare_string(path, actual, expect)