cgen: optional expr fix
parent
ed50fef1c0
commit
c993489fe9
|
@ -24,6 +24,7 @@ mut:
|
|||
optionals []string // to avoid duplicates TODO perf, use map
|
||||
inside_ternary bool // ?: comma separated statements on a single line
|
||||
stmt_start_pos int
|
||||
right_is_opt bool
|
||||
}
|
||||
|
||||
pub fn cgen(files []ast.File, table &table.Table) string {
|
||||
|
@ -598,6 +599,9 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||
}
|
||||
else {
|
||||
g.is_assign_expr = true
|
||||
if table.type_is_optional(it.right_type) {
|
||||
g.right_is_opt = true
|
||||
}
|
||||
mut str_add := false
|
||||
if it.left_type == table.string_type_idx && it.op == .plus_assign {
|
||||
// str += str2 => `str = string_add(str, str2)`
|
||||
|
@ -622,6 +626,7 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||
else if str_add {
|
||||
g.write(')')
|
||||
}
|
||||
g.right_is_opt = false
|
||||
}
|
||||
}
|
||||
ast.Assoc {
|
||||
|
@ -1142,7 +1147,11 @@ fn (g mut Gen) ident(node ast.Ident) {
|
|||
// TODO `is`
|
||||
match node.info {
|
||||
ast.IdentVar {
|
||||
if it.is_optional && !g.is_assign_expr {
|
||||
// x ?int
|
||||
// `x = 10` => `x.data = 10` (g.right_is_opt == false)
|
||||
// `x = new_opt()` => `x = new_opt()` (g.right_is_opt == true)
|
||||
// `println(x)` => `println(*(int*)x.data)`
|
||||
if it.is_optional && !(g.is_assign_expr && g.right_is_opt) {
|
||||
g.write('/*opt*/')
|
||||
styp := g.typ(it.typ)[7..] // Option_int => int TODO perf?
|
||||
g.write('(*($styp*)${name}.data)')
|
||||
|
|
|
@ -52,8 +52,7 @@ void function2() {
|
|||
}
|
||||
if (false) {
|
||||
foo(1);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
puts(tos3("else"));
|
||||
foo(100);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue