checker: temporary error for optional struct fields (#11293) (#11534)

pull/11550/head
Rémi 2021-09-18 20:22:24 +00:00 committed by GitHub
parent 0b4e03ad5c
commit e76be4ba37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 9 deletions

View File

@ -1173,6 +1173,10 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type {
node.fields[i].typ = expr_type node.fields[i].typ = expr_type
node.fields[i].expected_type = field_info.typ node.fields[i].expected_type = field_info.typ
} }
if field_info.typ.has_flag(.optional) {
c.error('field `$field_info.name` is optional, but initialization of optional fields currently unsupported',
field.pos)
}
if expr_type.is_ptr() && expected_type.is_ptr() { if expr_type.is_ptr() && expected_type.is_ptr() {
if mut field.expr is ast.Ident { if mut field.expr is ast.Ident {
if mut field.expr.obj is ast.Var { if mut field.expr.obj is ast.Var {

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/optional_fn_err.vv:13:16: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:13:16: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
11 | 11 |
12 | const ( 12 | const (
13 | const_value = bar(0) 13 | const_value = bar(0)
| ~~~~~~ | ~~~~~~
@ -31,21 +31,21 @@ vlib/v/checker/tests/optional_fn_err.vv:35:16: error: bar() returns an option, s
34 | _ := bar(0) 34 | _ := bar(0)
35 | println(twice(bar(0))) 35 | println(twice(bar(0)))
| ~~~~~~ | ~~~~~~
36 | 36 |
37 | // anon fn 37 | // anon fn
vlib/v/checker/tests/optional_fn_err.vv:38:16: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:38:16: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
36 | 36 |
37 | // anon fn 37 | // anon fn
38 | fn (_ int) {}(bar(0)) 38 | fn (_ int) {}(bar(0))
| ~~~~~~ | ~~~~~~
39 | 39 |
40 | // assert 40 | // assert
vlib/v/checker/tests/optional_fn_err.vv:41:9: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:41:9: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
39 | 39 |
40 | // assert 40 | // assert
41 | assert bar(true) 41 | assert bar(true)
| ~~~~~~~~~ | ~~~~~~~~~
42 | 42 |
43 | // struct 43 | // struct
vlib/v/checker/tests/optional_fn_err.vv:46:10: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:46:10: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
44 | mut v := Data{ 44 | mut v := Data{
@ -54,6 +54,13 @@ vlib/v/checker/tests/optional_fn_err.vv:46:10: error: bar() returns an option, s
| ~~~~~~ | ~~~~~~
47 | opt: bar(0), 47 | opt: bar(0),
48 | } 48 | }
vlib/v/checker/tests/optional_fn_err.vv:47:3: error: field `opt` is optional, but initialization of optional fields currently unsupported
45 | f: fn (_ int) {},
46 | value: bar(0),
47 | opt: bar(0),
| ~~~~~~~~~~~
48 | }
49 | v.add(bar(0)) // call method
vlib/v/checker/tests/optional_fn_err.vv:49:8: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:49:8: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
47 | opt: bar(0), 47 | opt: bar(0),
48 | } 48 | }
@ -66,7 +73,7 @@ vlib/v/checker/tests/optional_fn_err.vv:50:6: error: bar() returns an option, so
49 | v.add(bar(0)) // call method 49 | v.add(bar(0)) // call method
50 | v.f(bar(0)) // call fn field 50 | v.f(bar(0)) // call fn field
| ~~~~~~ | ~~~~~~
51 | 51 |
52 | // array 52 | // array
vlib/v/checker/tests/optional_fn_err.vv:54:9: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:54:9: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
52 | // array 52 | // array
@ -157,11 +164,11 @@ vlib/v/checker/tests/optional_fn_err.vv:70:18: error: bar() returns an option, s
69 | println(arr.any(bar(true))) 69 | println(arr.any(bar(true)))
70 | println(arr.all(bar(true))) 70 | println(arr.all(bar(true)))
| ~~~~~~~~~ | ~~~~~~~~~
71 | 71 |
72 | match bar(0) { 72 | match bar(0) {
vlib/v/checker/tests/optional_fn_err.vv:72:8: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end vlib/v/checker/tests/optional_fn_err.vv:72:8: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
70 | println(arr.all(bar(true))) 70 | println(arr.all(bar(true)))
71 | 71 |
72 | match bar(0) { 72 | match bar(0) {
| ~~~~~~ | ~~~~~~
73 | 0 { } 73 | 0 { }