From ee9cfb6df4806de732d8d053fc599fedb4ef3ebf Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Thu, 27 Apr 2023 10:50:09 -0300 Subject: [PATCH] checker: add check for mixing multi-return results with other types in return statements (fix #17501) (#18067) --- vlib/v/checker/return.v | 3 +++ vlib/v/checker/tests/multireturn_mix_err.out | 6 ++++++ vlib/v/checker/tests/multireturn_mix_err.vv | 7 +++++++ 3 files changed, 16 insertions(+) create mode 100644 vlib/v/checker/tests/multireturn_mix_err.out create mode 100644 vlib/v/checker/tests/multireturn_mix_err.vv diff --git a/vlib/v/checker/return.v b/vlib/v/checker/return.v index ac95dfd0f..ce2f1c174 100644 --- a/vlib/v/checker/return.v +++ b/vlib/v/checker/return.v @@ -82,6 +82,9 @@ fn (mut c Checker) return_stmt(mut node ast.Return) { // Unpack multi return types sym := c.table.sym(typ) if sym.kind == .multi_return { + if i > 0 || i != node.exprs.len - 1 { + c.error('cannot use multi-return with other return types', expr.pos()) + } for t in sym.mr_info().types { got_types << t expr_idxs << i diff --git a/vlib/v/checker/tests/multireturn_mix_err.out b/vlib/v/checker/tests/multireturn_mix_err.out new file mode 100644 index 000000000..c0c5dd87d --- /dev/null +++ b/vlib/v/checker/tests/multireturn_mix_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/multireturn_mix_err.vv:6:9: error: cannot use multi-return with other return types + 4 | + 5 | fn foo() (string, int, bool) { + 6 | return goo(), true + | ~~~~~ + 7 | } diff --git a/vlib/v/checker/tests/multireturn_mix_err.vv b/vlib/v/checker/tests/multireturn_mix_err.vv new file mode 100644 index 000000000..2c4ef615a --- /dev/null +++ b/vlib/v/checker/tests/multireturn_mix_err.vv @@ -0,0 +1,7 @@ +fn goo() (string, int) { + return '', 100 +} + +fn foo() (string, int, bool) { + return goo(), true +} -- 2.39.5