From 39e80afab0f8720de2593d36eddacbf7ea0189f3 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 15 Mar 2023 15:24:36 -0300 Subject: [PATCH] checker: fix missing check for wrong assignment: non-option to option type (#17628) --- vlib/v/checker/assign.v | 4 ++++ vlib/v/checker/tests/option_var_assign_err.out | 7 +++++++ vlib/v/checker/tests/option_var_assign_err.vv | 14 ++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 vlib/v/checker/tests/option_var_assign_err.out create mode 100644 vlib/v/checker/tests/option_var_assign_err.vv diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index b1c0aadd1f..10f01a80ef 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -208,6 +208,10 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { } else { // Make sure the variable is mutable c.fail_if_immutable(left) + + if !is_blank_ident && !left_type.has_flag(.option) && right_type.has_flag(.option) { + c.error('cannot assign an Option value to a non-option variable', right.pos()) + } // left_type = c.expr(left) // if right is ast.None && !left_type.has_flag(.option) { // println(left_type) diff --git a/vlib/v/checker/tests/option_var_assign_err.out b/vlib/v/checker/tests/option_var_assign_err.out new file mode 100644 index 0000000000..0c4a482134 --- /dev/null +++ b/vlib/v/checker/tests/option_var_assign_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/option_var_assign_err.vv:7:12: error: cannot assign an Option value to a non-option variable + 5 | + 6 | if value == 1 { + 7 | result = trying_to_change_non_opt_to_option(0) + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 8 | } + 9 | return result diff --git a/vlib/v/checker/tests/option_var_assign_err.vv b/vlib/v/checker/tests/option_var_assign_err.vv new file mode 100644 index 0000000000..efbb723847 --- /dev/null +++ b/vlib/v/checker/tests/option_var_assign_err.vv @@ -0,0 +1,14 @@ +module main + +fn trying_to_change_non_opt_to_option(value int) ?int { + mut result := 122 + + if value == 1 { + result = trying_to_change_non_opt_to_option(0) + } + return result +} + +fn main() { + println(trying_to_change_non_opt_to_option(0)) +}