From aebb551e933053a8dd6952c3f6530381998a77b3 Mon Sep 17 00:00:00 2001 From: Don Park Date: Mon, 26 Apr 2021 23:18:48 -0600 Subject: [PATCH] cgen: do full struct initialisation for V structs, fixes invalid data from `map[string]Struct{}['unknown']` (#9878) --- cmd/tools/modules/testing/common.v | 4 - examples/sokol/02_cubes_glsl/cube_glsl.v | 6 +- .../sokol/03_march_tracing_glsl/rt_glsl.v | 6 +- examples/sokol/04_multi_shader_glsl/rt_glsl.v | 12 +-- examples/sokol/05_instancing_glsl/rt_glsl.v | 9 +- .../06_obj_viewer/{ => modules}/obj/obj.v | 4 +- .../06_obj_viewer/{ => modules}/obj/rend.v | 8 +- .../06_obj_viewer/{ => modules}/obj/struct.v | 4 +- .../06_obj_viewer/{ => modules}/obj/util.v | 6 +- vlib/gg/gg.v | 4 +- vlib/net/udp.v | 14 ++-- vlib/sokol/gfx/gfx_structs.v | 82 +++++++++---------- vlib/v/ast/table.v | 4 +- vlib/v/checker/checker.v | 7 +- vlib/v/gen/c/cgen.v | 27 +++--- vlib/v/tests/map_value_init_test.v | 9 ++ 16 files changed, 107 insertions(+), 99 deletions(-) rename examples/sokol/06_obj_viewer/{ => modules}/obj/obj.v (100%) rename examples/sokol/06_obj_viewer/{ => modules}/obj/rend.v (98%) rename examples/sokol/06_obj_viewer/{ => modules}/obj/struct.v (97%) rename examples/sokol/06_obj_viewer/{ => modules}/obj/util.v (81%) create mode 100644 vlib/v/tests/map_value_init_test.v diff --git a/cmd/tools/modules/testing/common.v b/cmd/tools/modules/testing/common.v index 76c29602a5..4ccc330f94 100644 --- a/cmd/tools/modules/testing/common.v +++ b/cmd/tools/modules/testing/common.v @@ -140,10 +140,6 @@ pub fn new_test_session(_vargs string) TestSession { skip_files << 'examples/sokol/05_instancing_glsl/rt_glsl.v' // Skip obj_viewer code in the CI skip_files << 'examples/sokol/06_obj_viewer/show_obj.v' - skip_files << 'examples/sokol/06_obj_viewer/obj/obj.v' - skip_files << 'examples/sokol/06_obj_viewer/obj/rend.v' - skip_files << 'examples/sokol/06_obj_viewer/obj/struct.v' - skip_files << 'examples/sokol/06_obj_viewer/obj/util.v' } if testing.github_job != 'ubuntu-tcc' { skip_files << 'examples/c_interop_wkhtmltopdf.v' // needs installation of wkhtmltopdf from https://github.com/wkhtmltopdf/packaging/releases diff --git a/examples/sokol/02_cubes_glsl/cube_glsl.v b/examples/sokol/02_cubes_glsl/cube_glsl.v index ffdb4ae206..3b7c1d7073 100644 --- a/examples/sokol/02_cubes_glsl/cube_glsl.v +++ b/examples/sokol/02_cubes_glsl/cube_glsl.v @@ -293,7 +293,7 @@ fn init_cube_glsl(mut app App) { Vertex_t{ 1.0, 1.0, -1.0, c, 0, d}, ] - mut vert_buffer_desc := C.sg_buffer_desc{} + mut vert_buffer_desc := C.sg_buffer_desc{label: c'cube-vertices'} unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) } vert_buffer_desc.size = size_t(vertices.len * int(sizeof(Vertex_t))) @@ -304,7 +304,6 @@ fn init_cube_glsl(mut app App) { vert_buffer_desc.@type = .vertexbuffer // vert_buffer_desc.usage = .immutable - vert_buffer_desc.label = 'cube-vertices'.str vbuf := gfx.make_buffer(&vert_buffer_desc) /* create an index buffer for the cube */ @@ -317,7 +316,7 @@ fn init_cube_glsl(mut app App) { 22, 21, 20, 23, 22, 20 ] - mut index_buffer_desc := C.sg_buffer_desc{} + mut index_buffer_desc := C.sg_buffer_desc{label: c'cube-indices'} unsafe { C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc)) } index_buffer_desc.size = size_t(indices.len * int(sizeof(u16))) @@ -327,7 +326,6 @@ fn init_cube_glsl(mut app App) { } index_buffer_desc.@type = .indexbuffer - index_buffer_desc.label = 'cube-indices'.str ibuf := gfx.make_buffer(&index_buffer_desc) // create shader diff --git a/examples/sokol/03_march_tracing_glsl/rt_glsl.v b/examples/sokol/03_march_tracing_glsl/rt_glsl.v index fc8ba310a0..50b62ed2cf 100644 --- a/examples/sokol/03_march_tracing_glsl/rt_glsl.v +++ b/examples/sokol/03_march_tracing_glsl/rt_glsl.v @@ -172,7 +172,7 @@ fn init_cube_glsl(mut app App) { Vertex_t{ 1.0, 1.0, -1.0, c, 0, d}, ] - mut vert_buffer_desc := C.sg_buffer_desc{} + mut vert_buffer_desc := C.sg_buffer_desc{label: c'cube-vertices'} unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) } vert_buffer_desc.size = size_t(vertices.len * int(sizeof(Vertex_t))) @@ -182,7 +182,6 @@ fn init_cube_glsl(mut app App) { } vert_buffer_desc.@type = .vertexbuffer - vert_buffer_desc.label = 'cube-vertices'.str vbuf := gfx.make_buffer(&vert_buffer_desc) // create an index buffer for the cube @@ -195,7 +194,7 @@ fn init_cube_glsl(mut app App) { 22, 21, 20, 23, 22, 20, ] - mut index_buffer_desc := C.sg_buffer_desc{} + mut index_buffer_desc := C.sg_buffer_desc{label: c'cube-indices'} unsafe {C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc))} index_buffer_desc.size = size_t(indices.len * int(sizeof(u16))) @@ -205,7 +204,6 @@ fn init_cube_glsl(mut app App) { } index_buffer_desc.@type = .indexbuffer - index_buffer_desc.label = "cube-indices".str ibuf := gfx.make_buffer(&index_buffer_desc) // create shader diff --git a/examples/sokol/04_multi_shader_glsl/rt_glsl.v b/examples/sokol/04_multi_shader_glsl/rt_glsl.v index bb6109c682..059ad0e207 100644 --- a/examples/sokol/04_multi_shader_glsl/rt_glsl.v +++ b/examples/sokol/04_multi_shader_glsl/rt_glsl.v @@ -176,7 +176,7 @@ fn init_cube_glsl_m(mut app App) { Vertex_t{ 1.0, 1.0, -1.0, c, 0, d}, ] - mut vert_buffer_desc := C.sg_buffer_desc{} + mut vert_buffer_desc := C.sg_buffer_desc{label: c'cube-vertices'} unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) } vert_buffer_desc.size = size_t(vertices.len * int(sizeof(Vertex_t))) vert_buffer_desc.data = C.sg_range{ @@ -184,7 +184,6 @@ fn init_cube_glsl_m(mut app App) { size: size_t(vertices.len * int(sizeof(Vertex_t))) } vert_buffer_desc.@type = .vertexbuffer - vert_buffer_desc.label = 'cube-vertices'.str vbuf := gfx.make_buffer(&vert_buffer_desc) /* create an index buffer for the cube */ @@ -199,7 +198,7 @@ fn init_cube_glsl_m(mut app App) { */ ] - mut index_buffer_desc := C.sg_buffer_desc{} + mut index_buffer_desc := C.sg_buffer_desc{label: c'cube-indices'} unsafe { C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc)) } index_buffer_desc.size = size_t(indices.len * int(sizeof(u16))) index_buffer_desc.data = C.sg_range{ @@ -207,7 +206,6 @@ fn init_cube_glsl_m(mut app App) { size: size_t(indices.len * int(sizeof(u16))) } index_buffer_desc.@type = .indexbuffer - index_buffer_desc.label = 'cube-indices'.str ibuf := gfx.make_buffer(&index_buffer_desc) // create shader @@ -284,7 +282,7 @@ fn init_cube_glsl_p(mut app App) { Vertex_t{ 1.0, 1.0, -1.0, c, 0, d}, ] - mut vert_buffer_desc := C.sg_buffer_desc{} + mut vert_buffer_desc := C.sg_buffer_desc{label: c'cube-vertices'} unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) } vert_buffer_desc.size = size_t(vertices.len * int(sizeof(Vertex_t))) vert_buffer_desc.data = C.sg_range{ @@ -292,7 +290,6 @@ fn init_cube_glsl_p(mut app App) { size: size_t(vertices.len * int(sizeof(Vertex_t))) } vert_buffer_desc.@type = .vertexbuffer - vert_buffer_desc.label = 'cube-vertices'.str vbuf := gfx.make_buffer(&vert_buffer_desc) /* create an index buffer for the cube */ @@ -308,7 +305,7 @@ fn init_cube_glsl_p(mut app App) { ] - mut index_buffer_desc := C.sg_buffer_desc{} + mut index_buffer_desc := C.sg_buffer_desc{label: c'cube-indices'} unsafe { C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc)) } index_buffer_desc.size = size_t(indices.len * int(sizeof(u16))) index_buffer_desc.data = C.sg_range{ @@ -316,7 +313,6 @@ fn init_cube_glsl_p(mut app App) { size: size_t(indices.len * int(sizeof(u16))) } index_buffer_desc.@type = .indexbuffer - index_buffer_desc.label = 'cube-indices'.str ibuf := gfx.make_buffer(&index_buffer_desc) // create shader diff --git a/examples/sokol/05_instancing_glsl/rt_glsl.v b/examples/sokol/05_instancing_glsl/rt_glsl.v index 2196748571..57b0b606f1 100644 --- a/examples/sokol/05_instancing_glsl/rt_glsl.v +++ b/examples/sokol/05_instancing_glsl/rt_glsl.v @@ -189,7 +189,7 @@ fn init_cube_glsl_i(mut app App) { Vertex_t{ 1.0, 1.0, -1.0, c, 0, d}, ] - mut vert_buffer_desc := C.sg_buffer_desc{} + mut vert_buffer_desc := C.sg_buffer_desc{label: c'cube-vertices'} unsafe {C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc))} vert_buffer_desc.size = size_t(vertices.len * int(sizeof(Vertex_t))) vert_buffer_desc.data = C.sg_range{ @@ -197,17 +197,15 @@ fn init_cube_glsl_i(mut app App) { size: size_t(vertices.len * int(sizeof(Vertex_t))) } vert_buffer_desc.@type = .vertexbuffer - vert_buffer_desc.label = "cube-vertices".str vbuf := gfx.make_buffer(&vert_buffer_desc) /* create an instance buffer for the cube */ - mut inst_buffer_desc := C.sg_buffer_desc{} + mut inst_buffer_desc := C.sg_buffer_desc{label: c'instance-data'} unsafe {C.memset(&inst_buffer_desc, 0, sizeof(inst_buffer_desc))} inst_buffer_desc.size = size_t(num_inst * int(sizeof(m4.Vec4))) inst_buffer_desc.@type = .vertexbuffer inst_buffer_desc.usage = .stream - inst_buffer_desc.label = "instance-data".str inst_buf := gfx.make_buffer(&inst_buffer_desc) @@ -221,7 +219,7 @@ fn init_cube_glsl_i(mut app App) { 22, 21, 20, 23, 22, 20 ] - mut index_buffer_desc := C.sg_buffer_desc{} + mut index_buffer_desc := C.sg_buffer_desc{label: c'cube-indices'} unsafe {C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc))} index_buffer_desc.size = size_t(indices.len * int(sizeof(u16))) index_buffer_desc.data = C.sg_range{ @@ -229,7 +227,6 @@ fn init_cube_glsl_i(mut app App) { size: size_t(indices.len * int(sizeof(u16))) } index_buffer_desc.@type = .indexbuffer - index_buffer_desc.label = "cube-indices".str ibuf := gfx.make_buffer(&index_buffer_desc) /* create shader */ diff --git a/examples/sokol/06_obj_viewer/obj/obj.v b/examples/sokol/06_obj_viewer/modules/obj/obj.v similarity index 100% rename from examples/sokol/06_obj_viewer/obj/obj.v rename to examples/sokol/06_obj_viewer/modules/obj/obj.v index 799295ab5d..1d239a0a56 100644 --- a/examples/sokol/06_obj_viewer/obj/obj.v +++ b/examples/sokol/06_obj_viewer/modules/obj/obj.v @@ -1,3 +1,5 @@ +module obj + /********************************************************************** * * .obj loader @@ -8,8 +10,6 @@ * * TODO: **********************************************************************/ -module obj - import gg.m4 import strconv diff --git a/examples/sokol/06_obj_viewer/obj/rend.v b/examples/sokol/06_obj_viewer/modules/obj/rend.v similarity index 98% rename from examples/sokol/06_obj_viewer/obj/rend.v rename to examples/sokol/06_obj_viewer/modules/obj/rend.v index c637a552f0..d4ea3bc007 100644 --- a/examples/sokol/06_obj_viewer/obj/rend.v +++ b/examples/sokol/06_obj_viewer/modules/obj/rend.v @@ -68,7 +68,9 @@ pub fn (mut obj_part ObjPart) create_pipeline(in_part []int, shader C.sg_shader, res.material = obj_part.part[in_part[0]].material // vertex buffer - mut vert_buffer_desc := C.sg_buffer_desc{} + mut vert_buffer_desc := C.sg_buffer_desc{ + label: 0 + } unsafe { C.memset(&vert_buffer_desc, 0, sizeof(vert_buffer_desc)) } vert_buffer_desc.size = size_t(obj_buf.vbuf.len * int(sizeof(Vertex_pnct))) @@ -82,7 +84,9 @@ pub fn (mut obj_part ObjPart) create_pipeline(in_part []int, shader C.sg_shader, vbuf := gfx.make_buffer(&vert_buffer_desc) // index buffer - mut index_buffer_desc := C.sg_buffer_desc{} + mut index_buffer_desc := C.sg_buffer_desc{ + label: 0 + } unsafe { C.memset(&index_buffer_desc, 0, sizeof(index_buffer_desc)) } index_buffer_desc.size = size_t(obj_buf.ibuf.len * int(sizeof(u32))) diff --git a/examples/sokol/06_obj_viewer/obj/struct.v b/examples/sokol/06_obj_viewer/modules/obj/struct.v similarity index 97% rename from examples/sokol/06_obj_viewer/obj/struct.v rename to examples/sokol/06_obj_viewer/modules/obj/struct.v index a07a9ad7b4..55a528b5f6 100644 --- a/examples/sokol/06_obj_viewer/obj/struct.v +++ b/examples/sokol/06_obj_viewer/modules/obj/struct.v @@ -86,10 +86,10 @@ pub mut: ka m4.Vec4 = m4.Vec4{ e: [f32(0.1), 0.0, 0.0, 1.0]! } - kd m4.Vec4 = m4.Vec4{ + kd m4.Vec4 = m4.Vec4{ e: [f32(0.5), 0.5, 0.5, 1.0]! } - ks m4.Vec4 = m4.Vec4{ + ks m4.Vec4 = m4.Vec4{ e: [f32(1.0), 1.0, 1.0, 1.0]! } } diff --git a/examples/sokol/06_obj_viewer/obj/util.v b/examples/sokol/06_obj_viewer/modules/obj/util.v similarity index 81% rename from examples/sokol/06_obj_viewer/obj/util.v rename to examples/sokol/06_obj_viewer/modules/obj/util.v index 93473bc62f..a1e596a97a 100644 --- a/examples/sokol/06_obj_viewer/obj/util.v +++ b/examples/sokol/06_obj_viewer/modules/obj/util.v @@ -14,9 +14,9 @@ pub fn read_lines_from_file(file_path string) []string { } rows = bts.bytestr().split_into_lines() } $else { - path = 'assets/models/' + file_path + path = os.resource_abs_path('assets/models/' + file_path) rows = os.read_lines(path) or { - eprintln('File [$path] NOT FOUND!') + eprintln('File [$path] NOT FOUND! file_path: $file_path') return rows } } @@ -34,7 +34,7 @@ pub fn read_bytes_from_file(file_path string) []byte { exit(0) } } $else { - path = 'assets/models/' + file_path + path = os.resource_abs_path('assets/models/' + file_path) buffer = os.read_bytes(path) or { eprintln('Texure file: [$path] NOT FOUND!') exit(0) diff --git a/vlib/gg/gg.v b/vlib/gg/gg.v index a4f2b16d86..67226e3f1c 100644 --- a/vlib/gg/gg.v +++ b/vlib/gg/gg.v @@ -189,7 +189,9 @@ fn gg_init_sokol_window(user_data voidptr) { } } // - mut pipdesc := C.sg_pipeline_desc{} + mut pipdesc := C.sg_pipeline_desc{ + label: c'alpha_image' + } unsafe { C.memset(&pipdesc, 0, sizeof(pipdesc)) } color_state := C.sg_color_state{ diff --git a/vlib/net/udp.v b/vlib/net/udp.v index 9e4976eb0d..55daacc643 100644 --- a/vlib/net/udp.v +++ b/vlib/net/udp.v @@ -9,8 +9,8 @@ const ( struct UdpSocket { handle int - l Addr - r ?Addr + local Addr + remote ?Addr } pub struct UdpConn { @@ -28,8 +28,8 @@ pub fn dial_udp(laddr string, raddr string) ?&UdpConn { sbase := new_udp_socket(local.port) ? sock := UdpSocket{ handle: sbase.handle - l: local - r: resolve_wrapper(raddr) + local: local + remote: resolve_wrapper(raddr) } return &UdpConn{ sock: sock @@ -45,7 +45,7 @@ fn resolve_wrapper(raddr string) ?Addr { return x } -pub fn (mut c UdpConn) write_ptr(b byteptr, len int) ?int { +pub fn (mut c UdpConn) write_ptr(b &byte, len int) ?int { remote := c.sock.remote() or { return err_no_udp_remote } return c.write_to_ptr(remote, b, len) } @@ -63,7 +63,7 @@ pub fn (mut c UdpConn) write_string(s string) ?int { return c.write_ptr(s.str, s.len) } -pub fn (mut c UdpConn) write_to_ptr(addr Addr, b byteptr, len int) ?int { +pub fn (mut c UdpConn) write_to_ptr(addr Addr, b &byte, len int) ?int { res := C.sendto(c.sock.handle, b, len, 0, &addr.addr, addr.len) if res >= 0 { return res @@ -207,7 +207,7 @@ fn new_udp_socket(local_port int) ?&UdpSocket { } pub fn (s &UdpSocket) remote() ?Addr { - return s.r + return s.remote } pub fn (mut s UdpSocket) set_option_bool(opt SocketOption, value bool) ? { diff --git a/vlib/sokol/gfx/gfx_structs.v b/vlib/sokol/gfx/gfx_structs.v index 5702a6efa2..e40384ac27 100644 --- a/vlib/sokol/gfx/gfx_structs.v +++ b/vlib/sokol/gfx/gfx_structs.v @@ -24,7 +24,7 @@ pub struct C.sg_desc { d3d11_render_target_view_cb fn() voidptr d3d11_depth_stencil_view_cb fn() voidptr */ - _end_canary u32 + _end_canary u32 } pub struct C.sg_context_desc { @@ -43,7 +43,7 @@ pub struct C.sg_context_desc { } pub struct C.sg_gl_context_desc { - gl_force_gles2 bool + force_gles2 bool } pub struct C.sg_metal_context_desc { @@ -82,7 +82,7 @@ pub mut: sample_count int blend_color C.sg_color alpha_to_coverage_enabled bool - label byteptr + label &char = &char(0) _end_canary u32 } @@ -156,7 +156,7 @@ pub mut: attrs [16]C.sg_shader_attr_desc vs C.sg_shader_stage_desc fs C.sg_shader_stage_desc - label byteptr + label &char _end_canary u32 } @@ -210,16 +210,16 @@ pub fn (desc &C.sg_shader_desc) make_shader() C.sg_shader { pub struct C.sg_shader_attr_desc { pub mut: - name byteptr // GLSL vertex attribute name (only required for GLES2) - sem_name byteptr // HLSL semantic name - sem_index int // HLSL semantic index + name &char // GLSL vertex attribute name (only required for GLES2) + sem_name &char // HLSL semantic name + sem_index int // HLSL semantic index } pub struct C.sg_shader_stage_desc { pub mut: - source byteptr + source &char bytecode C.sg_range - entry byteptr + entry &char uniform_blocks [4]C.sg_shader_uniform_block_desc images [12]C.sg_shader_image_desc } @@ -238,14 +238,14 @@ pub mut: pub struct C.sg_shader_uniform_desc { pub mut: - name byteptr + name &char @type UniformType array_count int } pub struct C.sg_shader_image_desc { pub mut: - name byteptr + name &char image_type ImageType } @@ -284,7 +284,7 @@ pub mut: _start_canary u32 color_attachments [4]C.sg_pass_attachment_desc depth_stencil_attachment C.sg_pass_attachment_desc - label byteptr + label &char _end_canary u32 } @@ -316,14 +316,14 @@ pub mut: @type BufferType usage Usage data C.sg_range - label byteptr + label &char // GL specific - gl_buffers [2]u32 + gl_buffers [2]u32 // Metal specific - mtl_buffers [2]voidptr + mtl_buffers [2]voidptr // D3D11 specific - d3d11_buffer voidptr - _end_canary u32 + d3d11_buffer voidptr + _end_canary u32 } pub struct C.sg_buffer_info { @@ -364,18 +364,18 @@ pub mut: min_lod f32 max_lod f32 data C.sg_image_data - label byteptr + label &char // GL specific - gl_textures [2]u32 + gl_textures [2]u32 gl_texture_target u32 // Metal specific - mtl_textures [2]voidptr + mtl_textures [2]voidptr // D3D11 specific - d3d11_texture voidptr + d3d11_texture voidptr d3d11_shader_resource_view voidptr // WebGPU specific - wgpu_texture voidptr - _end_canary u32 + wgpu_texture voidptr + _end_canary u32 } pub struct C.sg_image_info { @@ -397,7 +397,7 @@ pub fn (i C.sg_image) free() { pub struct C.sg_image_data { pub mut: - //subimage [C.SG_CUBEFACE_NUM][C.SG_MAX_MIPMAPS]C.sg_range + // subimage [C.SG_CUBEFACE_NUM][C.SG_MAX_MIPMAPS]C.sg_range subimage [6][16]C.sg_range } @@ -445,21 +445,21 @@ pub mut: } pub struct C.sg_stencil_state { - enabled bool - front C.sg_stencil_face_state - back C.sg_stencil_face_state - read_mask byte + enabled bool + front C.sg_stencil_face_state + back C.sg_stencil_face_state + read_mask byte write_mask byte - ref byte + ref byte } pub struct C.sg_depth_state { - pixel_format PixelFormat - compare CompareFunc - write_enabled bool - bias f32 + pixel_format PixelFormat + compare CompareFunc + write_enabled bool + bias f32 bias_slope_scale f32 - bias_clamp f32 + bias_clamp f32 } pub struct C.sg_stencil_face_state { @@ -471,13 +471,13 @@ pub struct C.sg_stencil_face_state { pub struct C.sg_blend_state { pub mut: - enabled bool - src_factor_rgb BlendFactor - dst_factor_rgb BlendFactor - op_rgb BlendOp - src_factor_alpha BlendFactor - dst_factor_alpha BlendFactor - op_alpha BlendOp + enabled bool + src_factor_rgb BlendFactor + dst_factor_rgb BlendFactor + op_rgb BlendOp + src_factor_alpha BlendFactor + dst_factor_alpha BlendFactor + op_alpha BlendOp } pub struct C.sg_color_attachment_action { diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 6cbd3e3c2a..c44a3c8ada 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -197,9 +197,7 @@ pub fn (t &Table) is_same_method(f &Fn, func &Fn) string { } pub fn (t &Table) find_fn(name string) ?Fn { - f := t.fns[name] - if f.name.str != 0 { - // TODO + if f := t.fns[name] { return f } return none diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 7260340fc8..6839590ecb 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2730,8 +2730,10 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) { } return_stmt.types = got_types // allow `none` & `error` return types for function that returns optional + option_type_idx := c.table.type_idxs['Option'] + got_types_0_idx := got_types[0].idx() if exp_is_optional - && got_types[0].idx() in [ast.none_type_idx, ast.error_type_idx, c.table.type_idxs['Option']] { + && got_types_0_idx in [ast.none_type_idx, ast.error_type_idx, option_type_idx] { return } if expected_types.len > 0 && expected_types.len != got_types.len { @@ -4485,7 +4487,8 @@ pub fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { if to_type_sym.language != .c { c.ensure_type_exists(node.typ, node.pos) or {} } - expr_is_ptr := node.expr_type.is_ptr() || node.expr_type.idx() in ast.pointer_type_idxs + n_e_t_idx := node.expr_type.idx() + expr_is_ptr := node.expr_type.is_ptr() || n_e_t_idx in ast.pointer_type_idxs if expr_is_ptr && to_type_sym.kind == .string && !node.in_prexpr { if node.has_arg { c.warn('to convert a C string buffer pointer to a V string, please use x.vstring_with_len(len) instead of string(x,len)', diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 5a394a6f40..d44639d694 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -5250,7 +5250,9 @@ fn (mut g Gen) struct_init(struct_init ast.StructInit) { continue } if field.typ.has_flag(.optional) { - // TODO handle/require optionals in inits + field_name := c_name(field.name) + g.write('.$field_name = {0},') + initialized = true continue } if field.typ in info.embeds { @@ -5906,16 +5908,21 @@ fn (mut g Gen) type_default(typ_ ast.Type) string { mut has_none_zero := false mut init_str := '{' info := sym.info as ast.Struct - for field in info.fields { - field_sym := g.table.get_type_symbol(field.typ) - if field_sym.kind in [.array, .map] || field.has_default_expr { - if field.has_default_expr { - expr_str := g.expr_string(field.default_expr) - init_str += '.$field.name = $expr_str,' - } else { - init_str += '.$field.name = ${g.type_default(field.typ)},' + typ_is_shared_f := typ.has_flag(.shared_f) + if sym.language == .v && !typ_is_shared_f { + for field in info.fields { + field_sym := g.table.get_type_symbol(field.typ) + if field.has_default_expr + || field_sym.kind in [.array, .map, .string, .ustring, .bool, .alias, .size_t, .i8, .i16, .int, .i64, .byte, .u16, .u32, .u64, .char, .voidptr, .byteptr, .charptr, .struct_] { + field_name := c_name(field.name) + if field.has_default_expr { + expr_str := g.expr_string(field.default_expr) + init_str += '.$field_name = $expr_str,' + } else { + init_str += '.$field_name = ${g.type_default(field.typ)},' + } + has_none_zero = true } - has_none_zero = true } } if has_none_zero { diff --git a/vlib/v/tests/map_value_init_test.v b/vlib/v/tests/map_value_init_test.v new file mode 100644 index 0000000000..dab7460a25 --- /dev/null +++ b/vlib/v/tests/map_value_init_test.v @@ -0,0 +1,9 @@ +struct Test { + s string +} + +fn test_map_value_init() { + m := map[string]Test{} + empty := m['not-here'] + assert !isnil(empty.s.str) +}