From 29857cb9d62ebbc225f40adcee6bd8dc48c4c898 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 6 Dec 2020 04:41:54 +0800 Subject: [PATCH] checker: fix interpolation recursive str (fix #1905) (#7141) --- vlib/v/checker/check_types.v | 4 ++++ .../tests/interpolation_recursive_str_err.out | 7 +++++++ .../tests/interpolation_recursive_str_err.vv | 15 +++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 vlib/v/checker/tests/interpolation_recursive_str_err.out create mode 100644 vlib/v/checker/tests/interpolation_recursive_str_err.vv diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index a66547dc0e..53c05bda7d 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -390,6 +390,10 @@ pub fn (mut c Checker) string_inter_lit(mut node ast.StringInterLiteral) table.T } node.need_fmts[i] = fmt != c.get_default_fmt(ftyp, typ) } + // check recursive str + if c.cur_fn.is_method && c.cur_fn.name == 'str' && c.cur_fn.receiver.name == expr.str() { + c.error('cannot call `str()` method recursively', expr.position()) + } } return table.string_type } diff --git a/vlib/v/checker/tests/interpolation_recursive_str_err.out b/vlib/v/checker/tests/interpolation_recursive_str_err.out new file mode 100644 index 0000000000..c47f72fada --- /dev/null +++ b/vlib/v/checker/tests/interpolation_recursive_str_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/interpolation_recursive_str_err.vv:8:8: error: cannot call `str()` method recursively + 6 | + 7 | fn (t Test) str() string { + 8 | _ = '$t' + | ^ + 9 | return 'test' + 10 | } diff --git a/vlib/v/checker/tests/interpolation_recursive_str_err.vv b/vlib/v/checker/tests/interpolation_recursive_str_err.vv new file mode 100644 index 0000000000..4f3f3d80b5 --- /dev/null +++ b/vlib/v/checker/tests/interpolation_recursive_str_err.vv @@ -0,0 +1,15 @@ +module main + +struct Test { + a int +} + +fn (t Test) str() string { + _ = '$t' + return 'test' +} + +fn main() { + a := Test{} + println(a) +}