diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index e47636e647..0b523d68f9 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -519,8 +519,15 @@ fn (mut g Gen) gen_array_sort(node ast.CallExpr) { } fn (mut g Gen) gen_array_sort_call(node ast.CallExpr, compare_fn string) { - deref_field := if node.left_type.is_ptr() || node.left_type.is_pointer() { '->' } else { '.' } - // eprintln('> qsort: pointer $node.left_type | deref: `$deref`') + mut deref_field := if node.left_type.is_ptr() || node.left_type.is_pointer() { + '->' + } else { + '.' + } + if node.left_type.has_flag(.shared_f) { + deref_field += 'val.' + } + // eprintln('> qsort: pointer $node.left_type | deref_field: `$deref_field`') g.empty_line = true g.write('qsort(') g.expr(node.left) diff --git a/vlib/v/tests/shared_array_sort_test.v b/vlib/v/tests/shared_array_sort_test.v new file mode 100644 index 0000000000..1953d0831b --- /dev/null +++ b/vlib/v/tests/shared_array_sort_test.v @@ -0,0 +1,34 @@ +module main + +import time + +struct Alarms { +mut: + times shared []time.Time +} + +fn (alarms Alarms) add(alarm time.Time) { + lock alarms.times { + alarms.times << alarm + alarms.times.sort(a < b) + } +} + +fn test_sorting_shared_arrays() ? { + alarms := Alarms{} + utc := time.utc() + alarms.add(utc) + alarms.add(time.parse_iso8601('2022-03-01')?) + alarms.add(time.parse_iso8601('3001-03-01')?) + alarms.add(time.parse_iso8601('2002-03-01')?) + alarms.add(time.parse_iso8601('3002-03-01')?) + alarms.add(time.parse_iso8601('2021-03-01')?) + println(alarms) + lock alarms.times { + assert alarms.times.len == 6 + assert alarms.times[0].year == 2002 + assert alarms.times.pop().year == 3002 + assert alarms.times.pop().year == 3001 + assert alarms.times.len == 4 + } +}