cgen: check unknown sizeof type (#8815)
parent
bf6e9ff95a
commit
a119affeba
|
@ -0,0 +1,6 @@
|
||||||
|
vlib/v/checker/tests/unknown_sizeof_type_err_a.vv:14:34: cgen error: unknown type `T`
|
||||||
|
12 | println("size of Abc: ${sizeof(Abc)}")
|
||||||
|
13 | println("size of Xyz: ${sizeof(Xyz)}")
|
||||||
|
14 | println("size of Test: ${sizeof(T)}")
|
||||||
|
| ^
|
||||||
|
15 | }
|
|
@ -0,0 +1,15 @@
|
||||||
|
struct Abc {
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Xyz {
|
||||||
|
f f64
|
||||||
|
}
|
||||||
|
|
||||||
|
type Test = Abc | Xyz
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println("size of Abc: ${sizeof(Abc)}")
|
||||||
|
println("size of Xyz: ${sizeof(Xyz)}")
|
||||||
|
println("size of Test: ${sizeof(T)}")
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
vlib/v/checker/tests/unknown_sizeof_type_err_b.vv:14:34: cgen error: unknown type `Zabc`
|
||||||
|
12 | println("size of Abc: ${sizeof(Abc)}")
|
||||||
|
13 | println("size of Xyz: ${sizeof(Xyz)}")
|
||||||
|
14 | println("size of Test: ${sizeof(Zabc)}")
|
||||||
|
| ~~~~
|
||||||
|
15 | }
|
|
@ -0,0 +1,15 @@
|
||||||
|
struct Abc {
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Xyz {
|
||||||
|
f f64
|
||||||
|
}
|
||||||
|
|
||||||
|
type Test = Abc | Xyz
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println("size of Abc: ${sizeof(Abc)}")
|
||||||
|
println("size of Xyz: ${sizeof(Xyz)}")
|
||||||
|
println("size of Test: ${sizeof(Zabc)}")
|
||||||
|
}
|
|
@ -2786,6 +2786,10 @@ fn (mut g Gen) expr(node ast.Expr) {
|
||||||
}
|
}
|
||||||
ast.SizeOf {
|
ast.SizeOf {
|
||||||
node_typ := g.unwrap_generic(node.typ)
|
node_typ := g.unwrap_generic(node.typ)
|
||||||
|
sym := g.table.get_type_symbol(node_typ)
|
||||||
|
if sym.language == .v && sym.kind in [.placeholder, .any] {
|
||||||
|
g.error('unknown type `$sym.name`', node.pos)
|
||||||
|
}
|
||||||
styp := g.typ(node_typ)
|
styp := g.typ(node_typ)
|
||||||
g.write('/*SizeOf*/ sizeof(${util.no_dots(styp)})')
|
g.write('/*SizeOf*/ sizeof(${util.no_dots(styp)})')
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,9 +163,9 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.key_sizeof {
|
.key_sizeof {
|
||||||
pos := p.tok.position()
|
|
||||||
p.next() // sizeof
|
p.next() // sizeof
|
||||||
p.check(.lpar)
|
p.check(.lpar)
|
||||||
|
pos := p.tok.position()
|
||||||
is_known_var := p.mark_var_as_used(p.tok.lit)
|
is_known_var := p.mark_var_as_used(p.tok.lit)
|
||||||
// assume mod. prefix leads to a type
|
// assume mod. prefix leads to a type
|
||||||
if is_known_var || !(p.known_import(p.tok.lit) || p.tok.kind.is_start_of_type()) {
|
if is_known_var || !(p.known_import(p.tok.lit) || p.tok.kind.is_start_of_type()) {
|
||||||
|
|
Loading…
Reference in New Issue