diff --git a/vlib/strconv/atof_test.v b/vlib/strconv/atof_test.v index db34393f38..44a2d6e668 100644 --- a/vlib/strconv/atof_test.v +++ b/vlib/strconv/atof_test.v @@ -74,5 +74,5 @@ fn test_atof() { // DOUBLE_MINUS_ZERO f1=-0.0 assert *ptr == u64(0x8000000000000000) - //println("DONE!") + println("DONE!") } diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index d90735a7ce..faf1db3939 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -150,6 +150,7 @@ pub: pub_pos int // pub: pub_mut_pos int // pub mut: is_c bool + is_union bool } pub struct InterfaceDecl { diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 6a3aa7335c..731a223e1b 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -86,7 +86,7 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string indent: -1 } g.init() - // + // mut autofree_used := false for file in files { g.file = file @@ -115,7 +115,7 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string if g.is_test { g.write_tests_main() } - // + // g.finish() return g.hashes() + g.includes.str() + g.typedefs.str() + g.typedefs2.str() + g.definitions.str() + g.gowrappers.str() + g.stringliterals.str() + g.out.str() @@ -141,7 +141,7 @@ pub fn (g mut Gen) init() { g.write_sorted_types() g.write_multi_return_types() g.definitions.writeln('// end of definitions #endif') - // + // g.stringliterals.writeln('') g.stringliterals.writeln('// >> string literal consts') g.stringliterals.writeln('void vinit_string_literals(){') @@ -205,7 +205,7 @@ pub fn (g mut Gen) typ(t table.Type) string { return styp } -// +// pub fn (g mut Gen) write_typedef_types() { for typ in g.table.types { match typ.kind { @@ -460,7 +460,12 @@ fn (g mut Gen) stmt(node ast.Stmt) { // g.writeln('\t$field_type_sym.name $field.name;') // } // g.writeln('} $name;') - if !it.is_c { + if it.is_c { + return + } + if it.is_union { + g.typedefs.writeln('typedef union $name $name;') + } else { g.typedefs.writeln('typedef struct $name $name;') } } @@ -817,7 +822,7 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) { } } */ - // + // g.fn_args(it.args, it.is_variadic) if it.no_body { // Just a function header. @@ -1452,7 +1457,7 @@ fn (g mut Gen) match_expr(node ast.MatchExpr) { // sum_type_str } else if type_sym.kind == .string { g.write('string_eq(') - // + // g.expr(node.cond) g.write(', ') // g.write('string_eq($tmp, ') @@ -2121,7 +2126,11 @@ fn (g mut Gen) write_types(types []table.TypeSymbol) { table.Struct { info := typ.info as table.Struct // g.definitions.writeln('typedef struct {') - g.definitions.writeln('struct $name {') + if info.is_union { + g.definitions.writeln('union $name {') + } else { + g.definitions.writeln('struct $name {') + } if info.fields.len > 0 { for field in info.fields { type_name := g.typ(field.typ) @@ -2132,7 +2141,7 @@ fn (g mut Gen) write_types(types []table.TypeSymbol) { g.definitions.writeln('EMPTY_STRUCT_DECLARATION;') } // g.definitions.writeln('} $name;\n') - // + // g.definitions.writeln('};\n') } table.Alias { diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 4ef2ad62f3..0f05196ef4 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -661,8 +661,8 @@ pub fn (p mut Parser) name_expr() ast.Expr { x := p.call_expr(is_c, mod) // TODO `node,typ :=` should work node = x } - } else if p.peek_tok.kind == .lcbr && !p.inside_match_case && (is_c || p.tok.lit[0].is_capital() || - (p.builtin_mod && p.tok.lit in table.builtin_type_names)) && (p.tok.lit.len in [1, 2, 3] || + } else if p.peek_tok.kind == .lcbr && !p.inside_match_case && (is_c || p.tok.lit[0].is_capital() || + (p.builtin_mod && p.tok.lit in table.builtin_type_names)) && (p.tok.lit.len in [1, 2, 3] || !p.tok.lit[p.tok.lit.len - 1].is_capital() || p.table.known_type(p.tok.lit)) { // short_syntax: false return p.struct_init(false) @@ -1447,6 +1447,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { if is_pub { p.next() } + is_union := p.tok.kind == .key_union if p.tok.kind == .key_struct { p.check(.key_struct) } else { @@ -1535,6 +1536,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { info: table.Struct{ fields: fields is_typedef: is_typedef + is_union: is_union } } mut ret := 0 @@ -1558,6 +1560,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { pub_pos: pub_pos pub_mut_pos: pub_mut_pos is_c: is_c + is_union: is_union } } diff --git a/vlib/v/table/atypes.v b/vlib/v/table/atypes.v index 2e09c95ec2..93e90b5809 100644 --- a/vlib/v/table/atypes.v +++ b/vlib/v/table/atypes.v @@ -540,6 +540,7 @@ pub struct Struct { pub mut: fields []Field is_typedef bool // C. [typedef] + is_union bool } pub struct Enum {