checker: check number of fields in short struct inits (#6280)
parent
60a9d49382
commit
bd304f1141
|
@ -411,8 +411,14 @@ pub fn (mut c Checker) struct_init(mut struct_init ast.StructInit) table.Type {
|
||||||
} else {
|
} else {
|
||||||
info = type_sym.info as table.Struct
|
info = type_sym.info as table.Struct
|
||||||
}
|
}
|
||||||
if struct_init.is_short && struct_init.fields.len > info.fields.len {
|
if struct_init.is_short {
|
||||||
c.error('too many fields', struct_init.pos)
|
exp_len := info.fields.len
|
||||||
|
got_len := struct_init.fields.len
|
||||||
|
if exp_len != got_len {
|
||||||
|
amount := if exp_len < got_len { 'many' } else { 'few' }
|
||||||
|
c.error('too $amount fields in `$type_sym.source_name` literal (expecting $exp_len, got $got_len)',
|
||||||
|
struct_init.pos)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mut inited_fields := []string{}
|
mut inited_fields := []string{}
|
||||||
for i, field in struct_init.fields {
|
for i, field in struct_init.fields {
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
vlib/v/checker/tests/short_struct_too_many.vv:6:7: error: too many fields
|
|
||||||
4 |
|
|
||||||
5 | fn main() {
|
|
||||||
6 | t := Test{true, false}
|
|
||||||
| ~~~~~~~~~~~~~~~~~
|
|
||||||
7 | _ = t
|
|
||||||
8 | }
|
|
|
@ -1,8 +0,0 @@
|
||||||
struct Test {
|
|
||||||
foo bool
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
t := Test{true, false}
|
|
||||||
_ = t
|
|
||||||
}
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
vlib/v/checker/tests/short_struct_wrong_number.vv:7:6: error: too few fields in `Test` literal (expecting 2, got 1)
|
||||||
|
5 |
|
||||||
|
6 | fn main() {
|
||||||
|
7 | _ = Test{true}
|
||||||
|
| ~~~~~~~~~~
|
||||||
|
8 | _ = Test{true, false, true}
|
||||||
|
9 | }
|
||||||
|
vlib/v/checker/tests/short_struct_wrong_number.vv:8:6: error: too many fields in `Test` literal (expecting 2, got 3)
|
||||||
|
6 | fn main() {
|
||||||
|
7 | _ = Test{true}
|
||||||
|
8 | _ = Test{true, false, true}
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
9 | }
|
|
@ -0,0 +1,9 @@
|
||||||
|
struct Test {
|
||||||
|
foo bool
|
||||||
|
bar bool
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
_ = Test{true}
|
||||||
|
_ = Test{true, false, true}
|
||||||
|
}
|
|
@ -1,15 +1,15 @@
|
||||||
vlib/v/checker/tests/unknown_method_suggest_name.vv:7:2: error: unknown type `hash.crc32.Crc33`.
|
vlib/v/checker/tests/unknown_method_suggest_name.vv:13:2: error: unknown type `hash.crc32.Crc33`.
|
||||||
Did you mean `crc32.Crc32`?
|
Did you mean `crc32.Crc32`?
|
||||||
5 | y int
|
11 | y int
|
||||||
6 | z int
|
12 | z int
|
||||||
7 | ccc crc32.Crc33
|
13 | ccc crc32.Crc33
|
||||||
| ~~~~~~~~~~~~~~~
|
| ~~~~~~~~~~~~~~~
|
||||||
8 | }
|
14 | }
|
||||||
9 |
|
15 |
|
||||||
vlib/v/checker/tests/unknown_method_suggest_name.vv:27:9: error: unknown method: `Point.tranzlate`.
|
vlib/v/checker/tests/unknown_method_suggest_name.vv:27:9: error: unknown method: `Point.tranzlate`.
|
||||||
Did you mean `translate`?
|
Did you mean `translate`?
|
||||||
25 | p := Point{1, 2, 3}
|
25 | p := Point{1, 2, 3}
|
||||||
26 | v := Vector{5, 5, 10}
|
26 | v := Vector{x: 5, y: 5, z: 10}
|
||||||
27 | z := p.tranzlate(v)
|
27 | z := p.tranzlate(v)
|
||||||
| ~~~~~~~~~~~~
|
| ~~~~~~~~~~~~
|
||||||
28 | println('p: $p')
|
28 | println('p: $p')
|
||||||
|
|
|
@ -4,13 +4,13 @@ struct Point {
|
||||||
x int
|
x int
|
||||||
y int
|
y int
|
||||||
z int
|
z int
|
||||||
ccc crc32.Crc33
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Vector {
|
struct Vector {
|
||||||
x int
|
x int
|
||||||
y int
|
y int
|
||||||
z int
|
z int
|
||||||
|
ccc crc32.Crc33
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p Point) translate(v Vector) Point {
|
fn (p Point) translate(v Vector) Point {
|
||||||
|
@ -23,7 +23,7 @@ fn (p Point) identity() Point {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
p := Point{1, 2, 3}
|
p := Point{1, 2, 3}
|
||||||
v := Vector{5, 5, 10}
|
v := Vector{x: 5, y: 5, z: 10}
|
||||||
z := p.tranzlate(v)
|
z := p.tranzlate(v)
|
||||||
println('p: $p')
|
println('p: $p')
|
||||||
println('v: $v')
|
println('v: $v')
|
||||||
|
|
|
@ -32,7 +32,7 @@ pub fn dial_udp(laddr, raddr string) ?UdpConn {
|
||||||
}
|
}
|
||||||
|
|
||||||
return UdpConn {
|
return UdpConn {
|
||||||
sock
|
sock: sock
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue