cgen: fix for_in fixed_array of fixed_array literal (#9206)
							parent
							
								
									3edcb7e601
								
							
						
					
					
						commit
						c4b0fdcbaf
					
				| 
						 | 
				
			
			@ -1403,8 +1403,15 @@ fn (mut g Gen) for_in_stmt(node ast.ForInStmt) {
 | 
			
		|||
		}
 | 
			
		||||
	} else if node.kind == .array_fixed {
 | 
			
		||||
		mut cond_var := ''
 | 
			
		||||
		needs_tmp_var := node.cond_type.is_ptr() || node.cond is ast.ArrayInit
 | 
			
		||||
		if needs_tmp_var {
 | 
			
		||||
		cond_type_is_ptr := node.cond_type.is_ptr()
 | 
			
		||||
		cond_is_literal := node.cond is ast.ArrayInit
 | 
			
		||||
		if cond_is_literal {
 | 
			
		||||
			cond_var = g.new_tmp_var()
 | 
			
		||||
			g.write(g.typ(node.cond_type))
 | 
			
		||||
			g.write(' $cond_var = ')
 | 
			
		||||
			g.expr(node.cond)
 | 
			
		||||
			g.writeln(';')
 | 
			
		||||
		} else if cond_type_is_ptr {
 | 
			
		||||
			cond_var = g.new_tmp_var()
 | 
			
		||||
			cond_var_type := g.typ(node.cond_type).trim('*')
 | 
			
		||||
			if !node.cond.is_lvalue() {
 | 
			
		||||
| 
						 | 
				
			
			@ -1437,8 +1444,10 @@ fn (mut g Gen) for_in_stmt(node ast.ForInStmt) {
 | 
			
		|||
			}
 | 
			
		||||
			if !is_fixed_array {
 | 
			
		||||
				addr := if node.val_is_mut { '&' } else { '' }
 | 
			
		||||
				if needs_tmp_var {
 | 
			
		||||
				if cond_type_is_ptr {
 | 
			
		||||
					g.writeln(' = ${addr}(*$cond_var)[$idx];')
 | 
			
		||||
				} else if cond_is_literal {
 | 
			
		||||
					g.writeln(' = $addr$cond_var[$idx];')
 | 
			
		||||
				} else {
 | 
			
		||||
					g.write(' = $addr')
 | 
			
		||||
					g.expr(node.cond)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,18 @@ fn test_for_mut_in_fixed_array_of_fixed_array() {
 | 
			
		|||
	assert rets[2] == '[5, 6]'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_for_in_fixed_array_of_fixed_array_literal() {
 | 
			
		||||
	mut rets := []string{}
 | 
			
		||||
 | 
			
		||||
	for pair in [[1, 2]!, [3, 4]!, [5, 6]!]! {
 | 
			
		||||
		println(pair)
 | 
			
		||||
		rets << '$pair'
 | 
			
		||||
	}
 | 
			
		||||
	assert rets[0] == '[1, 2]'
 | 
			
		||||
	assert rets[1] == '[3, 4]'
 | 
			
		||||
	assert rets[2] == '[5, 6]'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_for_in_map_of_fixed_array() {
 | 
			
		||||
	mut rets := []string{}
 | 
			
		||||
	m := map{'aa': [1, 2]!, 'bb': [3, 4]!, 'cc': [5, 6]!}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue