checker: add error for `print( voidfn() )`

pull/9062/head
Delyan Angelov 2021-03-02 17:51:46 +02:00
parent 62ccd740f0
commit d0e8e8f178
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
4 changed files with 44 additions and 0 deletions

View File

@ -1901,6 +1901,9 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type {
c.inside_println_arg = true
c.expected_type = table.string_type
call_expr.args[0].typ = c.expr(call_expr.args[0].expr)
if call_expr.args[0].typ.is_void() {
c.error('`$fn_name` can not print void expressions', call_expr.pos)
}
if call_expr.args[0].typ.has_flag(.shared_f) {
c.fail_if_not_rlocked(call_expr.args[0].expr, 'argument to print')
}

View File

@ -4,3 +4,10 @@ vlib/v/checker/tests/for_in_index_type.vv:2:11: error: for in: cannot index `int
| ~~
3 | println(a)
4 | }
vlib/v/checker/tests/for_in_index_type.vv:3:3: error: `println` can not print void expressions
1 | fn main() {
2 | for a in 52 {
3 | println(a)
| ~~~~~~~~~~
4 | }
5 | }

View File

@ -0,0 +1,27 @@
vlib/v/checker/tests/println_can_not_print_void_expressions.vv:3:2: error: `print` can not print void expressions
1 | fn blabla() {}
2 | fn main() {
3 | print(blabla())
| ~~~~~~~~~~~~~~~
4 | println(blabla())
5 | eprint(blabla())
vlib/v/checker/tests/println_can_not_print_void_expressions.vv:4:2: error: `println` can not print void expressions
2 | fn main() {
3 | print(blabla())
4 | println(blabla())
| ~~~~~~~~~~~~~~~~~
5 | eprint(blabla())
6 | eprintln(blabla())
vlib/v/checker/tests/println_can_not_print_void_expressions.vv:5:2: error: `eprint` can not print void expressions
3 | print(blabla())
4 | println(blabla())
5 | eprint(blabla())
| ~~~~~~~~~~~~~~~~
6 | eprintln(blabla())
7 | }
vlib/v/checker/tests/println_can_not_print_void_expressions.vv:6:2: error: `eprintln` can not print void expressions
4 | println(blabla())
5 | eprint(blabla())
6 | eprintln(blabla())
| ~~~~~~~~~~~~~~~~~~
7 | }

View File

@ -0,0 +1,7 @@
fn blabla() {}
fn main() {
print(blabla())
println(blabla())
eprint(blabla())
eprintln(blabla())
}