From 60094d95e2f6cb5ed3a28dc44ab11beec32b59d2 Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 28 Jul 2022 02:32:00 +0800 Subject: [PATCH] cgen: check comptime call method (no value) used as value (#15241) --- .../tests/comptime_call_method_void_err.out | 7 +++++++ .../tests/comptime_call_method_void_err.vv | 20 +++++++++++++++++++ vlib/v/gen/c/comptime.v | 3 +++ 3 files changed, 30 insertions(+) create mode 100644 vlib/v/checker/tests/comptime_call_method_void_err.out create mode 100644 vlib/v/checker/tests/comptime_call_method_void_err.vv diff --git a/vlib/v/checker/tests/comptime_call_method_void_err.out b/vlib/v/checker/tests/comptime_call_method_void_err.out new file mode 100644 index 0000000000..1b4fec6124 --- /dev/null +++ b/vlib/v/checker/tests/comptime_call_method_void_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/comptime_call_method_void_err.vv:17:20: cgen error: method `sample1()` (no value) used as value + 15 | $for method in Dummy.methods { + 16 | if os.args.len >= 1 { + 17 | println(Dummy{}.$method(os.args[0])) + | ~~~~~~~~~~~~~~~~~~~ + 18 | } + 19 | } diff --git a/vlib/v/checker/tests/comptime_call_method_void_err.vv b/vlib/v/checker/tests/comptime_call_method_void_err.vv new file mode 100644 index 0000000000..8ecf1c9827 --- /dev/null +++ b/vlib/v/checker/tests/comptime_call_method_void_err.vv @@ -0,0 +1,20 @@ +import os + +struct Dummy {} + +fn (d Dummy) sample2(file_name string) int { + println(file_name) + return 22 +} + +fn (d Dummy) sample1(file_name string) { + println(file_name) +} + +fn main() { + $for method in Dummy.methods { + if os.args.len >= 1 { + println(Dummy{}.$method(os.args[0])) + } + } +} diff --git a/vlib/v/gen/c/comptime.v b/vlib/v/gen/c/comptime.v index e99c537aae..cdfa95e8d4 100644 --- a/vlib/v/gen/c/comptime.v +++ b/vlib/v/gen/c/comptime.v @@ -93,6 +93,9 @@ fn (mut g Gen) comptime_call(mut node ast.ComptimeCall) { for val in vals { } */ + if g.inside_call && m.return_type == ast.void_type { + g.error('method `${m.name}()` (no value) used as value', node.pos) + } expand_strs := if node.args.len > 0 && m.params.len - 1 >= node.args.len { arg := node.args[node.args.len - 1] param := m.params[node.args.len]