From 9fef7ca224d3620146c39f41432bcf3094153e36 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 6 Aug 2025 17:10:06 -0300 Subject: [PATCH] cgen: fix anon fn checking adding unresolved generic type on codegen (fix #25050) (#25055) --- vlib/v/gen/c/fn.v | 3 + vlib/v/tests/generics/generic_array_test.v | 113 +++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 vlib/v/tests/generics/generic_array_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 998583a677..11f8ed1257 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -218,6 +218,9 @@ fn (mut g Gen) gen_fn_decl(node &ast.FnDecl, skip bool) { the_type := syms.map(it.name).join(', ') println('gen fn `${node.name}` for type `${the_type}`') } + if concrete_types.any(it.has_flag(.generic)) { + continue + } g.cur_concrete_types = concrete_types g.gen_fn_decl(node, skip) } diff --git a/vlib/v/tests/generics/generic_array_test.v b/vlib/v/tests/generics/generic_array_test.v new file mode 100644 index 0000000000..0246492c05 --- /dev/null +++ b/vlib/v/tests/generics/generic_array_test.v @@ -0,0 +1,113 @@ +import arrays + +pub fn Canvas.new(width int, height int) &Canvas { + return &Canvas{ + layers: create_buffer(width, height) + } +} + +pub fn (canvas Canvas) size() (int, int) { + return canvas.layers[0].len, canvas.layers.len +} + +pub fn (canvas Canvas) string() string { + output := buffer_to_braille(canvas.layers, dots_to_braille_rune_map) + return arrays.join_to_string(output, '\n', |row| arrays.join_to_string(row, '', |character| '${character}')) +} + +pub fn (mut canvas Canvas) set(x int, y int) { + canvas.layers[y][x] = true +} + +pub fn (mut canvas Canvas) unset(x int, y int) { + canvas.layers[y][x] = false +} + +pub fn (mut canvas Canvas) clear() { + width, height := canvas.size() + canvas.layers = create_buffer(width, height) +} + +struct Canvas { +mut: + layers [][]bool +} + +const dots_to_braille = [u8(0), 3, 1, 4, 2, 5, 6, 7] +const dots_to_braille_rune_map = memoize_dots_to_braille_rune() + +fn dots_to_braille_rune(dots u8) rune { + mut mask := 0 + for index in 0 .. 8 { + if ((dots >> index) & 1) == 1 { + mask |= 1 << dots_to_braille[index] + } + } + + return rune(0x2800 + mask) +} + +fn memoize_dots_to_braille_rune() [256]rune { + mut memo := [256]rune{} + + for index in 0 .. 256 { + memo[index] = dots_to_braille_rune(index) + } + + return memo +} + +fn buffer_to_braille(buffer [][]bool, braille_mapping [256]rune) [][]rune { + out_rows := buffer.len / 4 + out_cols := buffer[0].len / 2 + mut output := [][]rune{len: out_rows, init: []rune{len: out_cols}} + + for row := 0; row < out_rows; row += 1 { + row_offset := row * 4 + for column := 0; column < out_cols; column += 1 { + col_offset := column * 2 + + mut dots := u8(buffer[row_offset + 0][col_offset + 0]) + dots |= u8(buffer[row_offset + 0][col_offset + 1]) << 1 + dots |= u8(buffer[row_offset + 1][col_offset + 0]) << 2 + dots |= u8(buffer[row_offset + 1][col_offset + 1]) << 3 + dots |= u8(buffer[row_offset + 2][col_offset + 0]) << 4 + dots |= u8(buffer[row_offset + 2][col_offset + 1]) << 5 + dots |= u8(buffer[row_offset + 3][col_offset + 0]) << 6 + dots |= u8(buffer[row_offset + 3][col_offset + 1]) << 7 + + output[row][column] = dots_to_braille_rune(dots) + } + } + + return output +} + +fn create_buffer(width int, height int) [][]bool { + return [][]bool{len: height, init: []bool{len: width}} +} + +fn test_main() { + braille_mapping := memoize_dots_to_braille_rune() + width, height := 40, 48 + mut canvas := Canvas.new(width, height) + mut buffer := [][]bool{len: height, init: []bool{len: width}} + + minr := 16 * 16 + maxr := 20 * 20 + for y := 0; y < 48; y += 1 { + for x := 0; x < width; x += 1 { + cy := y - 24 + big_cx := x - 20 + small_cx := x - 16 + big := (big_cx * big_cx) + (cy * cy) + small := (small_cx * small_cx) + (cy * cy) + if small > minr && big < maxr { + buffer[y][x] = true + canvas.set(x, y) + } + } + } + + _ := buffer_to_braille(buffer, braille_mapping) +}