cgen: fix alloc empty struct array error (#14007)
							parent
							
								
									843ce43077
								
							
						
					
					
						commit
						25d8faabf6
					
				| 
						 | 
					@ -300,3 +300,15 @@ fn test_alias_string_contains() {
 | 
				
			||||||
	names := [Str('')]
 | 
						names := [Str('')]
 | 
				
			||||||
	assert (Str('') in names) == true
 | 
						assert (Str('') in names) == true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct XYZ {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_array_append_empty_struct() {
 | 
				
			||||||
 | 
						mut names := []XYZ{cap: 2}
 | 
				
			||||||
 | 
						names << XYZ{}
 | 
				
			||||||
 | 
						assert (XYZ{} in names) == true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// test fixed array
 | 
				
			||||||
 | 
						array := [XYZ{}]
 | 
				
			||||||
 | 
						assert (XYZ{} in names) == true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit) {
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				g.write('0, ')
 | 
									g.write('0, ')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if elem_type.unaliased_sym.kind == .function {
 | 
								if elem_type.unaliased_sym.kind == .function || g.is_empty_struct(elem_type) {
 | 
				
			||||||
				g.write('sizeof(voidptr), ')
 | 
									g.write('sizeof(voidptr), ')
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				g.write('sizeof($elem_styp), ')
 | 
									g.write('sizeof($elem_styp), ')
 | 
				
			||||||
| 
						 | 
					@ -217,7 +217,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit) {
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			g.write('0, ')
 | 
								g.write('0, ')
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if elem_type.unaliased_sym.kind == .function {
 | 
							if elem_type.unaliased_sym.kind == .function || g.is_empty_struct(elem_type) {
 | 
				
			||||||
			g.write('sizeof(voidptr), ')
 | 
								g.write('sizeof(voidptr), ')
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			g.write('sizeof($elem_styp), ')
 | 
								g.write('sizeof($elem_styp), ')
 | 
				
			||||||
| 
						 | 
					@ -251,6 +251,8 @@ fn (mut g Gen) array_init(node ast.ArrayInit) {
 | 
				
			||||||
	len := node.exprs.len
 | 
						len := node.exprs.len
 | 
				
			||||||
	if elem_type.unaliased_sym.kind == .function {
 | 
						if elem_type.unaliased_sym.kind == .function {
 | 
				
			||||||
		g.write('new_array_from_c_array($len, $len, sizeof(voidptr), _MOV((voidptr[$len]){')
 | 
							g.write('new_array_from_c_array($len, $len, sizeof(voidptr), _MOV((voidptr[$len]){')
 | 
				
			||||||
 | 
						} else if g.is_empty_struct(elem_type) {
 | 
				
			||||||
 | 
							g.write('new_array_from_c_array${noscan}($len, $len, sizeof(voidptr), _MOV(($elem_styp[$len]){')
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		g.write('new_array_from_c_array${noscan}($len, $len, sizeof($elem_styp), _MOV(($elem_styp[$len]){')
 | 
							g.write('new_array_from_c_array${noscan}($len, $len, sizeof($elem_styp), _MOV(($elem_styp[$len]){')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,3 +305,18 @@ fn (mut g Gen) zero_struct_field(field ast.StructField) bool {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn (mut g Gen) is_empty_struct(t Type) bool {
 | 
				
			||||||
 | 
						sym := t.unaliased_sym
 | 
				
			||||||
 | 
						match sym.info {
 | 
				
			||||||
 | 
							ast.Struct {
 | 
				
			||||||
 | 
								if sym.info.fields.len > 0 || sym.info.embeds.len > 0 {
 | 
				
			||||||
 | 
									return false
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue