cgen: fix optional struct const field access (#7405)

pull/7415/head
Ned Palacios 2020-12-19 16:43:50 +08:00 committed by GitHub
parent 3eb835c630
commit 3a86f27b9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 0 deletions

View File

@ -2637,6 +2637,12 @@ fn (mut g Gen) expr(node ast.Expr) {
g.checker_bug('unexpected SelectorExpr.expr_type = 0', node.pos)
}
sym := g.table.get_type_symbol(node.expr_type)
// if node expr is a root ident and an optional
mut is_optional := node.expr is ast.Ident && node.expr_type.has_flag(.optional)
if is_optional {
opt_base_typ := g.base_type(node.expr_type)
g.writeln('(*($opt_base_typ*)')
}
if sym.kind == .array_fixed {
assert node.field_name == 'len'
info := sym.info as table.ArrayFixed
@ -2678,6 +2684,9 @@ fn (mut g Gen) expr(node ast.Expr) {
}
}
g.expr(node.expr)
if is_optional {
g.write('.data)')
}
// struct embedding
if sym.kind == .struct_ {
sym_info := sym.info as table.Struct

View File

@ -11,3 +11,26 @@ fn test_const() {
assert d == 11
assert c == 1
}
// const optional test
struct Foo {
name string = 'foo'
}
fn foo_decode(name string) ?Foo {
if name == 'baz' {
return error('baz is not allowed')
}
return Foo{name}
}
pub const (
def = foo_decode('baz') or { Foo{} }
bar = foo_decode('bar')?
)
fn test_opt_const() {
assert def.name == 'foo'
assert bar.name == 'bar'
}