From 6e493ca8ca0821910b21483ed5332a78e1b3b7f4 Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 28 May 2021 16:40:59 +0800 Subject: [PATCH] checker: check index_expr or_expr types mismatch (#10224) --- vlib/v/checker/checker.v | 1 + vlib/v/checker/tests/or_expr_types_mismatch.out | 14 ++++++++++++++ vlib/v/checker/tests/or_expr_types_mismatch.vv | 17 +++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 vlib/v/checker/tests/or_expr_types_mismatch.out create mode 100644 vlib/v/checker/tests/or_expr_types_mismatch.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 80c4907382..4c68a7467d 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -6522,6 +6522,7 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type { } } c.stmts(node.or_expr.stmts) + c.check_expr_opt_call(node, typ) return typ } diff --git a/vlib/v/checker/tests/or_expr_types_mismatch.out b/vlib/v/checker/tests/or_expr_types_mismatch.out new file mode 100644 index 0000000000..c84faa59bd --- /dev/null +++ b/vlib/v/checker/tests/or_expr_types_mismatch.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/or_expr_types_mismatch.vv:3:19: error: wrong return type `none` in the `or {}` block, expected `string` + 1 | fn get_map() ?string { + 2 | m := map{1: 'a', 2: 'b'} + 3 | return m[1] or { none } + | ~~~~ + 4 | } + 5 | +vlib/v/checker/tests/or_expr_types_mismatch.vv:8:19: error: wrong return type `none` in the `or {}` block, expected `int` + 6 | fn get_array() ?int { + 7 | a := [1, 2, 3] + 8 | return a[4] or { none } + | ~~~~ + 9 | } + 10 | diff --git a/vlib/v/checker/tests/or_expr_types_mismatch.vv b/vlib/v/checker/tests/or_expr_types_mismatch.vv new file mode 100644 index 0000000000..1b557c3695 --- /dev/null +++ b/vlib/v/checker/tests/or_expr_types_mismatch.vv @@ -0,0 +1,17 @@ +fn get_map() ?string { + m := map{1: 'a', 2: 'b'} + return m[1] or { none } +} + +fn get_array() ?int { + a := [1, 2, 3] + return a[4] or { none } +} + +fn main() { + map_result := get_map() or { return } + println(map_result) + + array_result := get_array() or { return } + println(array_result) +}