@@ -171,11 +171,28 @@ fn (mut g Gen) index_of_array(node ast.IndexExpr, sym ast.TypeSymbol) {
171171 info := sym.info as ast.Array
172172 elem_type := info.elem_type
173173 elem_sym := g.table.final_sym (elem_type)
174+ result_type := match true {
175+ gen_or && elem_type.has_flag (.option) {
176+ node.typ.clear_flag (.option)
177+ }
178+ gen_or {
179+ node.typ
180+ }
181+ else {
182+ elem_type
183+ }
184+ }
185+ result_sym := g.table.final_sym (result_type)
174186 elem_type_str := if elem_sym.kind == .function {
175187 'voidptr'
176188 } else {
177189 g.styp (info.elem_type)
178190 }
191+ result_type_str := if result_sym.kind == .function {
192+ 'voidptr'
193+ } else {
194+ g.styp (result_type)
195+ }
179196 left_is_shared := node.left_type.has_flag (.shared_f)
180197 // `vals[i].field = x` is an exception and requires `array_get`:
181198 // `(*(Val*)array_get(vals, i)).field = x;`
@@ -334,7 +351,16 @@ fn (mut g Gen) index_of_array(node ast.IndexExpr, sym ast.TypeSymbol) {
334351 opt_elem_type := g.styp (elem_type.set_flag (.option))
335352 g.writeln ('${opt_elem_type } ${tmp_opt } = {0};' )
336353 g.writeln ('if (${tmp_opt_ptr }) {' )
337- g.writeln ('\t *((${elem_type_str }*)&${tmp_opt }.data) = *((${elem_type_str }*)${tmp_opt_ptr });' )
354+ if elem_type.has_flag (.option) && ! g.inside_opt_or_res {
355+ g.writeln ('\t if (${tmp_opt_ptr }->state == 0) {' )
356+ g.writeln ('\t\t *((${result_type_str }*)&${tmp_opt }.data) = *((${result_type_str }*)${tmp_opt_ptr }->data);' )
357+ g.writeln ('\t } else {' )
358+ g.writeln ('\t\t ${tmp_opt }.state = ${tmp_opt_ptr }->state;' )
359+ g.writeln ('\t\t ${tmp_opt }.err = ${tmp_opt_ptr }->err;' )
360+ g.writeln ('\t }' )
361+ } else {
362+ g.writeln ('\t *((${elem_type_str }*)&${tmp_opt }.data) = *((${elem_type_str }*)${tmp_opt_ptr });' )
363+ }
338364 g.writeln ('} else {' )
339365 g.writeln ('\t ${tmp_opt }.state = 2; ${tmp_opt }.err = builtin___v_error(_S("array index out of range"));' )
340366 g.writeln ('}' )
@@ -344,6 +370,8 @@ fn (mut g Gen) index_of_array(node ast.IndexExpr, sym ast.TypeSymbol) {
344370 if ! g.is_amp {
345371 if g.inside_opt_or_res && elem_type.has_flag (.option) && g.inside_assign {
346372 g.write ('\n ${cur_line }(*(${elem_type_str }*)&${tmp_opt })' )
373+ } else if elem_type.has_flag (.option) && ! g.inside_opt_or_res {
374+ g.write ('\n ${cur_line }(*(${result_type_str }*)${tmp_opt }.data)' )
347375 } else {
348376 g.write ('\n ${cur_line }(*(${elem_type_str }*)${tmp_opt }.data)' )
349377 }
0 commit comments