From ed393896f50fa770147003150d39ee909fb7767a Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 23 Jun 2020 17:38:30 +0800 Subject: [PATCH] checker: check printing of optional type --- vlib/v/checker/checker.v | 4 ++++ vlib/v/checker/tests/print_optional_type_err.out | 6 ++++++ vlib/v/checker/tests/print_optional_type_err.vv | 4 ++++ 3 files changed, 14 insertions(+) create mode 100644 vlib/v/checker/tests/print_optional_type_err.out create mode 100644 vlib/v/checker/tests/print_optional_type_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 521797f104..2f5a51b7ad 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1017,6 +1017,10 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type { if (fn_name == 'println' || fn_name == 'print') && call_expr.args.len > 0 { c.expected_type = table.string_type call_expr.args[0].typ = c.expr(call_expr.args[0].expr) + // check optional argument + if call_expr.args[0].typ.has_flag(.optional) { + c.error('cannot print optional type', call_expr.args[0].expr.position()) + } /* // TODO: optimize `struct T{} fn (t &T) str() string {return 'abc'} mut a := []&T{} a << &T{} println(a[0])` // It currently generates: diff --git a/vlib/v/checker/tests/print_optional_type_err.out b/vlib/v/checker/tests/print_optional_type_err.out new file mode 100644 index 0000000000..38cbf86350 --- /dev/null +++ b/vlib/v/checker/tests/print_optional_type_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/print_optional_type_err.v:3:13: error: cannot print optional type + 1 | import os + 2 | fn main() { + 3 | println(os.ls('.')) + | ~~~~~~~ + 4 | } diff --git a/vlib/v/checker/tests/print_optional_type_err.vv b/vlib/v/checker/tests/print_optional_type_err.vv new file mode 100644 index 0000000000..738398aa5f --- /dev/null +++ b/vlib/v/checker/tests/print_optional_type_err.vv @@ -0,0 +1,4 @@ +import os +fn main() { + println(os.ls('.')) +}