diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 9404040cf6f790..b02613e0942f77 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -3590,6 +3590,12 @@ fn (mut c Checker) method_call(mut node ast.CallExpr, mut continue_check &bool) && c.table.register_fn_concrete_types(method.fkey(), concrete_types) { c.need_recheck_generic_fns = true } + if method_name == 'str' && c.table.cur_fn != unsafe { nil } && c.table.cur_fn.is_method + && c.table.cur_fn.name == 'str' && node.left is ast.Ident + && (node.left as ast.Ident).name == c.table.cur_fn.receiver.name + && left_type.idx() == c.table.cur_fn.receiver.typ.idx() { + c.error('cannot call `str()` method recursively', node.pos) + } node.is_noreturn = method.is_noreturn node.is_expand_simple_interpolation = method.is_expand_simple_interpolation node.is_ctor_new = method.is_ctor_new diff --git a/vlib/v/checker/tests/sum_type_recursive_str_err.out b/vlib/v/checker/tests/sum_type_recursive_str_err.out new file mode 100644 index 00000000000000..b622b8288c463c --- /dev/null +++ b/vlib/v/checker/tests/sum_type_recursive_str_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/sum_type_recursive_str_err.vv:6:12: error: cannot call `str()` method recursively + 4 | return match n { + 5 | u8 { n.str() } + 6 | else { n.str() } + | ~~~~~ + 7 | } + 8 | } diff --git a/vlib/v/checker/tests/sum_type_recursive_str_err.vv b/vlib/v/checker/tests/sum_type_recursive_str_err.vv new file mode 100644 index 00000000000000..918dec97fb94c0 --- /dev/null +++ b/vlib/v/checker/tests/sum_type_recursive_str_err.vv @@ -0,0 +1,12 @@ +type Num = u8 | u16 + +fn (n Num) str() string { + return match n { + u8 { n.str() } + else { n.str() } + } +} + +fn main() { + println(Num(u16(0))) +}