From 0498f4c40f685f8433726d2267a05429cfaaf40b Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Sun, 9 Jul 2023 22:10:10 +0530 Subject: [PATCH] checker: add an error for `$tmpl` function type mismatches (#18826) --- vlib/v/checker/return.v | 5 +++++ vlib/v/checker/tests/template_type_mismatch_err.out | 6 ++++++ vlib/v/checker/tests/template_type_mismatch_err.vv | 7 +++++++ vlib/v/checker/tests/templates/template.md | 1 + 4 files changed, 19 insertions(+) create mode 100644 vlib/v/checker/tests/template_type_mismatch_err.out create mode 100644 vlib/v/checker/tests/template_type_mismatch_err.vv create mode 100644 vlib/v/checker/tests/templates/template.md diff --git a/vlib/v/checker/return.v b/vlib/v/checker/return.v index b8388ae3cb..9e589d59f5 100644 --- a/vlib/v/checker/return.v +++ b/vlib/v/checker/return.v @@ -179,6 +179,11 @@ fn (mut c Checker) return_stmt(mut node ast.Return) { c.error('cannot use `${c.table.type_to_str(got_type)}` as ${c.error_type_name(exp_type)} in return argument', pos) } + if exprv is ast.ComptimeCall && exprv.method_name == 'tmpl' + && c.table.final_sym(exp_type).kind != .string { + c.error('cannot use `string` as type `${c.table.type_to_str(exp_type)}` in return argument', + exprv.pos) + } if node.exprs[expr_idxs[i]] !is ast.ComptimeCall { got_type_sym := c.table.sym(got_type) exp_type_sym := c.table.sym(exp_type) diff --git a/vlib/v/checker/tests/template_type_mismatch_err.out b/vlib/v/checker/tests/template_type_mismatch_err.out new file mode 100644 index 0000000000..1fe691b045 --- /dev/null +++ b/vlib/v/checker/tests/template_type_mismatch_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/template_type_mismatch_err.vv:6:9: error: cannot use `string` as type `int` in return argument + 4 | + 5 | fn return_item() int { + 6 | return $tmpl('./templates/template.md') + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 7 | } diff --git a/vlib/v/checker/tests/template_type_mismatch_err.vv b/vlib/v/checker/tests/template_type_mismatch_err.vv new file mode 100644 index 0000000000..41a29a1de6 --- /dev/null +++ b/vlib/v/checker/tests/template_type_mismatch_err.vv @@ -0,0 +1,7 @@ +fn main() { + println(return_item()) +} + +fn return_item() int { + return $tmpl('./templates/template.md') +} diff --git a/vlib/v/checker/tests/templates/template.md b/vlib/v/checker/tests/templates/template.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/vlib/v/checker/tests/templates/template.md @@ -0,0 +1 @@ +