diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 5bc1f8b06c..431c00e067 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2077,6 +2077,11 @@ pub fn (mut c Checker) selector_expr(mut selector_expr ast.SelectorExpr) table.T return table.void_type } selector_expr.expr_type = typ + if selector_expr.expr_type.has_flag(.optional) && !((selector_expr.expr is ast.Ident + && (selector_expr.expr as ast.Ident).kind == .constant)) { + c.error('cannot access fields of an optional, handle the error with `or {...}` or propagate it with `?`', + selector_expr.pos) + } field_name := selector_expr.field_name utyp := c.unwrap_generic(typ) sym := c.table.get_type_symbol(utyp) diff --git a/vlib/v/checker/tests/selector_expr_optional_err.out b/vlib/v/checker/tests/selector_expr_optional_err.out new file mode 100644 index 0000000000..51065b74a6 --- /dev/null +++ b/vlib/v/checker/tests/selector_expr_optional_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/selector_expr_optional_err.vv:4:46: error: cannot access fields of an optional, handle the error with `or {...}` or propagate it with `?` + 2 | + 3 | fn main() { + 4 | println(http.get('https://httpbin.org/').status_code) + | ~~~~~~~~~~~ + 5 | } diff --git a/vlib/v/checker/tests/selector_expr_optional_err.vv b/vlib/v/checker/tests/selector_expr_optional_err.vv new file mode 100644 index 0000000000..d277787b7a --- /dev/null +++ b/vlib/v/checker/tests/selector_expr_optional_err.vv @@ -0,0 +1,5 @@ +import net.http + +fn main() { + println(http.get('https://httpbin.org/').status_code) +}