cgen: str(): handle empty structs
							parent
							
								
									b411d29577
								
							
						
					
					
						commit
						436ef12730
					
				| 
						 | 
					@ -49,7 +49,7 @@ mut:
 | 
				
			||||||
	assign_op      token.Kind // *=, =, etc (for array_set)
 | 
						assign_op      token.Kind // *=, =, etc (for array_set)
 | 
				
			||||||
	defer_stmts    []ast.DeferStmt
 | 
						defer_stmts    []ast.DeferStmt
 | 
				
			||||||
	defer_ifdef    string
 | 
						defer_ifdef    string
 | 
				
			||||||
	str_types      []int // types that need automatic str() generation
 | 
						str_types      []string// types that need automatic str() generation
 | 
				
			||||||
	threaded_fns   []string // for generating unique wrapper types and fns for `go xxx()`
 | 
						threaded_fns   []string // for generating unique wrapper types and fns for `go xxx()`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2423,12 +2423,12 @@ fn (g mut Gen) fn_call(node ast.CallExpr) {
 | 
				
			||||||
		typ := node.args[0].typ
 | 
							typ := node.args[0].typ
 | 
				
			||||||
		mut styp := g.typ(typ)
 | 
							mut styp := g.typ(typ)
 | 
				
			||||||
		sym := g.table.get_type_symbol(typ)
 | 
							sym := g.table.get_type_symbol(typ)
 | 
				
			||||||
		if !sym.has_method('str') && !(int(typ) in g.str_types) {
 | 
							if !sym.has_method('str') && !(styp in g.str_types) {
 | 
				
			||||||
			// Generate an automatic str() method if this type doesn't have it already
 | 
								// Generate an automatic str() method if this type doesn't have it already
 | 
				
			||||||
			if table.type_is_ptr(typ) {
 | 
								if table.type_is_ptr(typ) {
 | 
				
			||||||
				styp = styp.replace('*', '')
 | 
									styp = styp.replace('*', '')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			g.str_types << typ
 | 
								g.str_types << styp
 | 
				
			||||||
			g.gen_str_for_type(sym, styp)
 | 
								g.gen_str_for_type(sym, styp)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if g.autofree && !table.type_is_optional(typ) {
 | 
							if g.autofree && !table.type_is_optional(typ) {
 | 
				
			||||||
| 
						 | 
					@ -2882,9 +2882,11 @@ fn (g mut Gen) gen_str_for_type(sym table.TypeSymbol, styp string) {
 | 
				
			||||||
	for field in info.fields {
 | 
						for field in info.fields {
 | 
				
			||||||
		fmt := type_to_fmt(field.typ)
 | 
							fmt := type_to_fmt(field.typ)
 | 
				
			||||||
		g.definitions.write('\t$field.name: $fmt\\n')
 | 
							g.definitions.write('\t$field.name: $fmt\\n')
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	g.definitions.write('\\n}", ')
 | 
						g.definitions.write('\\n}"')
 | 
				
			||||||
 | 
						if info.fields.len > 0 {
 | 
				
			||||||
 | 
							g.definitions.write(', ')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	for i, field in info.fields {
 | 
						for i, field in info.fields {
 | 
				
			||||||
		g.definitions.write('a.' + field.name)
 | 
							g.definitions.write('a.' + field.name)
 | 
				
			||||||
		if field.typ == table.string_type {
 | 
							if field.typ == table.string_type {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,7 +59,11 @@ struct ReservedKeywords {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_empty_struct() {
 | 
					fn test_empty_struct() {
 | 
				
			||||||
	d := &Empty{}
 | 
						d := &Empty{}
 | 
				
			||||||
 | 
						d2 := Empty{}
 | 
				
			||||||
 | 
						println('&empty:')
 | 
				
			||||||
	println(d) // != voidptr(0)
 | 
						println(d) // != voidptr(0)
 | 
				
			||||||
 | 
						println('empty:')
 | 
				
			||||||
 | 
						println(d2) // empty struct print
 | 
				
			||||||
	println(sizeof(Empty)) // == 0
 | 
						println(sizeof(Empty)) // == 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue