cgen: fix a[0]+='str'
parent
03829d9935
commit
d9409006fa
|
@ -871,3 +871,9 @@ fn test_mutli_array_index() {
|
|||
b[0][0] = 1
|
||||
assert '$b' == '[[1, 0, 0], [0, 0, 0]]'
|
||||
}
|
||||
|
||||
fn test_plus_assign_string() {
|
||||
mut a := ['']
|
||||
a[0] += 'abc'
|
||||
assert a == ['abc']
|
||||
}
|
||||
|
|
|
@ -1144,9 +1144,17 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
}
|
||||
mut str_add := false
|
||||
if var_type == table.string_type_idx && assign_stmt.op == .plus_assign {
|
||||
// str += str2 => `str = string_add(str, str2)`
|
||||
g.expr(left)
|
||||
g.write(' = /*f*/string_add(')
|
||||
if left is ast.IndexExpr {
|
||||
// a[0] += str => `array_set(&a, 0, &(string[]) {string_add(...))})`
|
||||
g.expr(left)
|
||||
g.write('string_add(')
|
||||
} else {
|
||||
// str += str2 => `str = string_add(str, str2)`
|
||||
g.expr(left)
|
||||
g.write(' = /*f*/string_add(')
|
||||
}
|
||||
g.is_assign_lhs = false
|
||||
g.is_assign_rhs = true
|
||||
str_add = true
|
||||
}
|
||||
if right_sym.kind == .function && is_decl {
|
||||
|
@ -1209,11 +1217,12 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
if unwrap_optional {
|
||||
g.write('.data')
|
||||
}
|
||||
if str_add {
|
||||
g.write(')')
|
||||
}
|
||||
if g.is_array_set {
|
||||
g.write(' })')
|
||||
g.is_array_set = false
|
||||
} else if str_add {
|
||||
g.write(')')
|
||||
}
|
||||
}
|
||||
g.right_is_opt = false
|
||||
|
@ -2196,7 +2205,8 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) {
|
|||
g.write(', &')
|
||||
}
|
||||
// `x[0] *= y`
|
||||
if g.assign_op != .assign && g.assign_op in token.assign_tokens {
|
||||
if g.assign_op != .assign && g.assign_op in token.assign_tokens &&
|
||||
info.elem_type != table.string_type {
|
||||
// TODO move this
|
||||
g.write('*($elem_type_str*)array_get(')
|
||||
if left_is_ptr {
|
||||
|
|
Loading…
Reference in New Issue