From 550fa6803615aceb1c89feda2fe666d71afa26bc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 8 Dec 2024 09:40:47 -0300 Subject: [PATCH] checker: fix selector generic or block (fix #23088) (#23102) --- vlib/v/checker/checker.v | 5 +++-- .../tests/selector_generic_or_block_err.out | 7 +++++++ .../tests/selector_generic_or_block_err.vv | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 vlib/v/checker/tests/selector_generic_or_block_err.out create mode 100644 vlib/v/checker/tests/selector_generic_or_block_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 699b21d72..631cfdab7 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1720,9 +1720,10 @@ fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type { } node.typ = field.typ if node.or_block.kind == .block { - c.expected_or_type = node.typ.clear_option_and_result() + unwrapped_typ := c.unwrap_generic(node.typ) + c.expected_or_type = unwrapped_typ.clear_option_and_result() c.stmts_ending_with_expression(mut node.or_block.stmts, c.expected_or_type) - c.check_or_expr(node.or_block, node.typ, c.expected_or_type, node) + c.check_or_expr(node.or_block, unwrapped_typ, c.expected_or_type, node) c.expected_or_type = ast.void_type } return field.typ diff --git a/vlib/v/checker/tests/selector_generic_or_block_err.out b/vlib/v/checker/tests/selector_generic_or_block_err.out new file mode 100644 index 000000000..20c11d86e --- /dev/null +++ b/vlib/v/checker/tests/selector_generic_or_block_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/selector_generic_or_block_err.vv:7:24: error: wrong return type `string` in the `or {}` block, expected `int` + 5 | + 6 | fn (f Foo[T]) str() string { + 7 | value := f.value or { 'this should be a checker error' } + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 8 | return '${value}' + 9 | } diff --git a/vlib/v/checker/tests/selector_generic_or_block_err.vv b/vlib/v/checker/tests/selector_generic_or_block_err.vv new file mode 100644 index 000000000..30db22c1b --- /dev/null +++ b/vlib/v/checker/tests/selector_generic_or_block_err.vv @@ -0,0 +1,17 @@ +struct Foo[T] { +pub: + value ?T +} + +fn (f Foo[T]) str() string { + value := f.value or { 'this should be a checker error' } + return '${value}' +} + +fn main() { + bar := Foo[int]{ + value: 0 + } + + println(bar) +} -- 2.39.5