authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-29 11:45:39+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-29 14:01:59+02:00
logf5e7d2d00c0bfdbdf95c57b8b5528f945fcf00c2
tree3993982b1875e38b132173aa536fe13814333121
parent59cc7072e22d03ba40456a58eaf3b37b239b420e
signature Commit is signed but in an unrecognized format.

translate-c fix bugs

Thanks @daurnimator

3 files changed, 151 insertions(+), 141 deletions(-)

lib/std/zig/render.zig+1-1
......@@ -643,7 +643,7 @@ fn renderExpression(
643643 },
644644
645645 .ArrayAccess => |index_expr| {
646 const lbracket = tree.prevToken(index_expr.firstToken());
646 const lbracket = tree.nextToken(suffix_op.lhs.node.lastToken());
647647 const rbracket = tree.nextToken(index_expr.lastToken());
648648
649649 try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
src-self-hosted/translate_c.zig+47-33
......@@ -410,11 +410,17 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
410410 const param_name = tokenSlice(c, param.name_token orelse
411411 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name}));
412412
413 const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: {
414 try block_scope.variables.push(.{ .name = param_name, .alias = a });
415 break :blk a;
416 } else param_name;
417 const arg_name = try std.fmt.allocPrint(c.a(), "_arg_{}", .{checked_param_name});
413 // in Zig top level declarations are order-independent so this might be shadowed later
414 const checked_param_name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ param_name, c.getMangle() });
415 try block_scope.variables.push(.{ .name = param_name, .alias = checked_param_name });
416
417 const arg_name = blk: {
418 const bare_arg_name = try std.fmt.allocPrint(c.a(), "_arg_{}", .{checked_param_name});
419 break :blk if (try scope.createAlias(rp.c, bare_arg_name)) |a|
420 a
421 else
422 bare_arg_name;
423 };
418424
419425 const node = try transCreateNodeVarDecl(c, false, false, checked_param_name);
420426 node.eq_token = try appendToken(c, .Equal, "=");
......@@ -533,49 +539,53 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error
533539
534540 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
535541
536 if (mem.eql(u8, typedef_name, "uint8_t"))
542 // TODO https://github.com/ziglang/zig/issues/3756
543 // TODO https://github.com/ziglang/zig/issues/1802
544 const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "_{}", .{typedef_name}) else typedef_name;
545
546 if (mem.eql(u8, checked_name, "uint8_t"))
537547 return transTypeDefAsBuiltin(c, typedef_decl, "u8")
538 else if (mem.eql(u8, typedef_name, "int8_t"))
548 else if (mem.eql(u8, checked_name, "int8_t"))
539549 return transTypeDefAsBuiltin(c, typedef_decl, "i8")
540 else if (mem.eql(u8, typedef_name, "uint16_t"))
550 else if (mem.eql(u8, checked_name, "uint16_t"))
541551 return transTypeDefAsBuiltin(c, typedef_decl, "u16")
542 else if (mem.eql(u8, typedef_name, "int16_t"))
552 else if (mem.eql(u8, checked_name, "int16_t"))
543553 return transTypeDefAsBuiltin(c, typedef_decl, "i16")
544 else if (mem.eql(u8, typedef_name, "uint32_t"))
554 else if (mem.eql(u8, checked_name, "uint32_t"))
545555 return transTypeDefAsBuiltin(c, typedef_decl, "u32")
546 else if (mem.eql(u8, typedef_name, "int32_t"))
556 else if (mem.eql(u8, checked_name, "int32_t"))
547557 return transTypeDefAsBuiltin(c, typedef_decl, "i32")
548 else if (mem.eql(u8, typedef_name, "uint64_t"))
558 else if (mem.eql(u8, checked_name, "uint64_t"))
549559 return transTypeDefAsBuiltin(c, typedef_decl, "u64")
550 else if (mem.eql(u8, typedef_name, "int64_t"))
560 else if (mem.eql(u8, checked_name, "int64_t"))
551561 return transTypeDefAsBuiltin(c, typedef_decl, "i64")
552 else if (mem.eql(u8, typedef_name, "intptr_t"))
562 else if (mem.eql(u8, checked_name, "intptr_t"))
553563 return transTypeDefAsBuiltin(c, typedef_decl, "isize")
554 else if (mem.eql(u8, typedef_name, "uintptr_t"))
564 else if (mem.eql(u8, checked_name, "uintptr_t"))
555565 return transTypeDefAsBuiltin(c, typedef_decl, "usize")
556 else if (mem.eql(u8, typedef_name, "ssize_t"))
566 else if (mem.eql(u8, checked_name, "ssize_t"))
557567 return transTypeDefAsBuiltin(c, typedef_decl, "isize")
558 else if (mem.eql(u8, typedef_name, "size_t"))
568 else if (mem.eql(u8, checked_name, "size_t"))
559569 return transTypeDefAsBuiltin(c, typedef_decl, "usize");
560570
561 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
571 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);
562572 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
563573 const const_tok = try appendToken(c, .Keyword_const, "const");
564 const node = try transCreateNodeVarDecl(c, true, true, typedef_name);
574 const node = try transCreateNodeVarDecl(c, true, true, checked_name);
565575 node.eq_token = try appendToken(c, .Equal, "=");
566576
567577 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
568578 const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl);
569579 node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) {
570580 error.UnsupportedType => {
571 try failDecl(c, typedef_loc, typedef_name, "unable to resolve typedef child type", .{});
581 try failDecl(c, typedef_loc, checked_name, "unable to resolve typedef child type", .{});
572582 return null;
573583 },
574584 error.OutOfMemory => |e| return e,
575585 };
576586 node.semicolon_token = try appendToken(c, .Semicolon, ";");
577 try addTopLevelDecl(c, typedef_name, &node.base);
578 return transCreateNodeIdentifier(c, typedef_name);
587 try addTopLevelDecl(c, checked_name, &node.base);
588 return transCreateNodeIdentifier(c, checked_name);
579589}
580590
581591fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node {
......@@ -4226,7 +4236,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
42264236 _ = try appendToken(c, .RParen, ")");
42274237
42284238 const type_of = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
4229 type_of.rparen_token = try appendToken(c, .LParen, ")");
4239 type_of.rparen_token = try appendToken(c, .RParen, ")");
42304240
42314241 const fn_proto = try c.a().create(ast.Node.FnProto);
42324242 fn_proto.* = .{
......@@ -4383,8 +4393,8 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
43834393 const type_of_1 = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
43844394 try type_id_1.params.push(&type_of_1.base);
43854395 try type_of_1.params.push(node_to_cast);
4386 type_of_1.rparen_token = try appendToken(c, .LParen, ")");
4387 type_id_1.rparen_token = try appendToken(c, .LParen, ")");
4396 type_of_1.rparen_token = try appendToken(c, .RParen, ")");
4397 type_id_1.rparen_token = try appendToken(c, .RParen, ")");
43884398
43894399 const cmp_1 = try c.a().create(ast.Node.InfixOp);
43904400 cmp_1.* = .{
......@@ -4394,12 +4404,12 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
43944404 .rhs = try transCreateNodeEnumLiteral(c, "Pointer"),
43954405 };
43964406 if_1.condition = &cmp_1.base;
4397 _ = try appendToken(c, .LParen, ")");
4407 _ = try appendToken(c, .RParen, ")");
43984408
43994409 const ptr_cast = try transCreateNodeBuiltinFnCall(c, "@ptrCast");
44004410 try ptr_cast.params.push(inner_node);
44014411 try ptr_cast.params.push(node_to_cast);
4402 ptr_cast.rparen_token = try appendToken(c, .LParen, ")");
4412 ptr_cast.rparen_token = try appendToken(c, .RParen, ")");
44034413 if_1.body = &ptr_cast.base;
44044414
44054415 const else_1 = try transCreateNodeElse(c);
......@@ -4410,8 +4420,8 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
44104420 const type_of_2 = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
44114421 try type_id_2.params.push(&type_of_2.base);
44124422 try type_of_2.params.push(node_to_cast);
4413 type_of_2.rparen_token = try appendToken(c, .LParen, ")");
4414 type_id_2.rparen_token = try appendToken(c, .LParen, ")");
4423 type_of_2.rparen_token = try appendToken(c, .RParen, ")");
4424 type_id_2.rparen_token = try appendToken(c, .RParen, ")");
44154425
44164426 const cmp_2 = try c.a().create(ast.Node.InfixOp);
44174427 cmp_2.* = .{
......@@ -4422,12 +4432,12 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
44224432 };
44234433 if_2.condition = &cmp_2.base;
44244434 else_1.body = &if_2.base;
4425 _ = try appendToken(c, .LParen, ")");
4435 _ = try appendToken(c, .RParen, ")");
44264436
44274437 const int_to_ptr = try transCreateNodeBuiltinFnCall(c, "@intToPtr");
44284438 try int_to_ptr.params.push(inner_node);
44294439 try int_to_ptr.params.push(node_to_cast);
4430 int_to_ptr.rparen_token = try appendToken(c, .LParen, ")");
4440 int_to_ptr.rparen_token = try appendToken(c, .RParen, ")");
44314441 if_2.body = &int_to_ptr.base;
44324442
44334443 const else_2 = try transCreateNodeElse(c);
......@@ -4436,7 +4446,7 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
44364446 const as = try transCreateNodeBuiltinFnCall(c, "@as");
44374447 try as.params.push(inner_node);
44384448 try as.params.push(node_to_cast);
4439 as.rparen_token = try appendToken(c, .LParen, ")");
4449 as.rparen_token = try appendToken(c, .RParen, ")");
44404450 else_2.body = &as.base;
44414451
44424452 return &if_1.base;
......@@ -4638,7 +4648,11 @@ fn parseCPrefixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
46384648
46394649fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 {
46404650 const tok = c.tree.tokens.at(token);
4641 return c.source_buffer.toSlice()[tok.start..tok.end];
4651 const slice = c.source_buffer.toSlice()[tok.start..tok.end];
4652 return if (mem.startsWith(u8, slice, "@\""))
4653 slice[2 .. slice.len - 1]
4654 else
4655 slice;
46424656}
46434657
46444658fn getContainer(c: *Context, node: *ast.Node) ?*ast.Node {
test/translate_c.zig+103-107
......@@ -1098,13 +1098,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
10981098 });
10991099
11001100 cases.add("comma operator",
1101 \\int foo(char c) {
1101 \\int foo() {
11021102 \\ 2, 4;
11031103 \\ return 2, 4, 6;
11041104 \\}
11051105 , &[_][]const u8{
1106 \\pub export fn foo(_arg_c: u8) c_int {
1107 \\ var c = _arg_c;
1106 \\pub export fn foo() c_int {
11081107 \\ _ = 2;
11091108 \\ _ = 4;
11101109 \\ _ = 2;
......@@ -1113,15 +1112,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11131112 \\}
11141113 });
11151114
1116 cases.add("wors-case assign",
1117 \\int foo(char c) {
1115 cases.add("worst-case assign",
1116 \\int foo() {
11181117 \\ int a;
11191118 \\ int b;
11201119 \\ a = b = 2;
11211120 \\}
11221121 , &[_][]const u8{
1123 \\pub export fn foo(_arg_c: u8) c_int {
1124 \\ var c = _arg_c;
1122 \\pub export fn foo() c_int {
11251123 \\ var a: c_int = undefined;
11261124 \\ var b: c_int = undefined;
11271125 \\ a = blk: {
......@@ -1133,7 +1131,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11331131 });
11341132
11351133 cases.add("if statements",
1136 \\int foo(char c) {
1134 \\int foo() {
11371135 \\ if (2) {
11381136 \\ int a = 2;
11391137 \\ }
......@@ -1142,8 +1140,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11421140 \\ }
11431141 \\}
11441142 , &[_][]const u8{
1145 \\pub export fn foo(_arg_c: u8) c_int {
1146 \\ var c = _arg_c;
1143 \\pub export fn foo() c_int {
11471144 \\ if (2 != 0) {
11481145 \\ var a: c_int = 2;
11491146 \\ }
......@@ -1266,15 +1263,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
12661263 \\ }
12671264 \\}
12681265 , &[_][]const u8{
1269 \\pub export fn switch_fn(_arg_i: c_int) c_int {
1270 \\ var i = _arg_i;
1266 \\pub export fn switch_fn(_arg_i_1: c_int) c_int {
1267 \\ var i_1 = _arg_i_1;
12711268 \\ var res: c_int = 0;
12721269 \\ __switch: {
12731270 \\ __case_2: {
12741271 \\ __default: {
12751272 \\ __case_1: {
12761273 \\ __case_0: {
1277 \\ switch (i) {
1274 \\ switch (i_1) {
12781275 \\ 0 => break :__case_0,
12791276 \\ 1...3 => break :__case_1,
12801277 \\ else => break :__default,
......@@ -1285,7 +1282,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
12851282 \\ }
12861283 \\ res = 2;
12871284 \\ }
1288 \\ res = (3 * i);
1285 \\ res = (3 * i_1);
12891286 \\ break :__switch;
12901287 \\ }
12911288 \\ res = 5;
......@@ -1328,11 +1325,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13281325 \\ a = tmp;
13291326 \\}
13301327 , &[_][]const u8{
1331 \\pub export fn max(_arg_a: c_int) c_int {
1332 \\ var a = _arg_a;
1328 \\pub export fn max(_arg_a_1: c_int) c_int {
1329 \\ var a_1 = _arg_a_1;
13331330 \\ var tmp: c_int = undefined;
1334 \\ tmp = a;
1335 \\ a = tmp;
1331 \\ tmp = a_1;
1332 \\ a_1 = tmp;
13361333 \\}
13371334 });
13381335
......@@ -1342,14 +1339,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13421339 \\ c = b = a;
13431340 \\}
13441341 , &[_][]const u8{
1345 \\pub export fn max(_arg_a: c_int) void {
1346 \\ var a = _arg_a;
1342 \\pub export fn max(_arg_a_1: c_int) void {
1343 \\ var a_1 = _arg_a_1;
13471344 \\ var b: c_int = undefined;
13481345 \\ var c: c_int = undefined;
13491346 \\ c = blk: {
1350 \\ const _tmp_1 = a;
1351 \\ b = _tmp_1;
1352 \\ break :blk _tmp_1;
1347 \\ const _tmp_2 = a_1;
1348 \\ b = _tmp_2;
1349 \\ break :blk _tmp_2;
13531350 \\ };
13541351 \\}
13551352 });
......@@ -1373,9 +1370,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13731370 \\ return (int)a;
13741371 \\}
13751372 , &[_][]const u8{
1376 \\pub export fn float_to_int(_arg_a: f32) c_int {
1377 \\ var a = _arg_a;
1378 \\ return @floatToInt(c_int, a);
1373 \\pub export fn float_to_int(_arg_a_1: f32) c_int {
1374 \\ var a_1 = _arg_a_1;
1375 \\ return @floatToInt(c_int, a_1);
13791376 \\}
13801377 });
13811378
......@@ -1469,23 +1466,23 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
14691466 \\ C,
14701467 \\};
14711468 \\pub const SomeTypedef = c_int;
1472 \\pub export fn and_or_non_bool(_arg_a: c_int, _arg_b: f32, _arg_c: ?*c_void) c_int {
1473 \\ var a = _arg_a;
1474 \\ var b = _arg_b;
1475 \\ var c = _arg_c;
1469 \\pub export fn and_or_non_bool(_arg_a_1: c_int, _arg_b_2: f32, _arg_c_3: ?*c_void) c_int {
1470 \\ var a_1 = _arg_a_1;
1471 \\ var b_2 = _arg_b_2;
1472 \\ var c_3 = _arg_c_3;
14761473 \\ var d: enum_Foo = @intToEnum(enum_Foo, FooA);
1477 \\ var e: c_int = @boolToInt(((a != 0) and (b != 0)));
1478 \\ var f: c_int = @boolToInt(((b != 0) and (c != null)));
1479 \\ var g: c_int = @boolToInt(((a != 0) and (c != null)));
1480 \\ var h: c_int = @boolToInt(((a != 0) or (b != 0)));
1481 \\ var i: c_int = @boolToInt(((b != 0) or (c != null)));
1482 \\ var j: c_int = @boolToInt(((a != 0) or (c != null)));
1483 \\ var k: c_int = @boolToInt(((a != 0) or (@enumToInt(d) != 0)));
1484 \\ var l: c_int = @boolToInt(((@enumToInt(d) != 0) and (b != 0)));
1485 \\ var m: c_int = @boolToInt(((c != null) or (@enumToInt(d) != 0)));
1474 \\ var e: c_int = @boolToInt(((a_1 != 0) and (b_2 != 0)));
1475 \\ var f: c_int = @boolToInt(((b_2 != 0) and (c_3 != null)));
1476 \\ var g: c_int = @boolToInt(((a_1 != 0) and (c_3 != null)));
1477 \\ var h: c_int = @boolToInt(((a_1 != 0) or (b_2 != 0)));
1478 \\ var i: c_int = @boolToInt(((b_2 != 0) or (c_3 != null)));
1479 \\ var j: c_int = @boolToInt(((a_1 != 0) or (c_3 != null)));
1480 \\ var k: c_int = @boolToInt(((a_1 != 0) or (@enumToInt(d) != 0)));
1481 \\ var l: c_int = @boolToInt(((@enumToInt(d) != 0) and (b_2 != 0)));
1482 \\ var m: c_int = @boolToInt(((c_3 != null) or (@enumToInt(d) != 0)));
14861483 \\ var td: SomeTypedef = 44;
1487 \\ var o: c_int = @boolToInt(((td != 0) or (b != 0)));
1488 \\ var p: c_int = @boolToInt(((c != null) and (td != 0)));
1484 \\ var o: c_int = @boolToInt(((td != 0) or (b_2 != 0)));
1485 \\ var p: c_int = @boolToInt(((c_3 != null) and (td != 0)));
14891486 \\ return ((((((((((e + f) + g) + h) + i) + j) + k) + l) + m) + o) + p);
14901487 \\}
14911488 ,
......@@ -1523,10 +1520,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15231520 \\ return (a & b) ^ (a | b);
15241521 \\}
15251522 , &[_][]const u8{
1526 \\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
1527 \\ var a = _arg_a;
1528 \\ var b = _arg_b;
1529 \\ return ((a & b) ^ (a | b));
1523 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1524 \\ var a_1 = _arg_a_1;
1525 \\ var b_2 = _arg_b_2;
1526 \\ return ((a_1 & b_2) ^ (a_1 | b_2));
15301527 \\}
15311528 });
15321529
......@@ -1542,13 +1539,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15421539 \\ return i;
15431540 \\}
15441541 , &[_][]const u8{
1545 \\pub export fn test_comparisons(_arg_a: c_int, _arg_b: c_int) c_int {
1546 \\ var a = _arg_a;
1547 \\ var b = _arg_b;
1548 \\ var c: c_int = @boolToInt((a < b));
1549 \\ var d: c_int = @boolToInt((a > b));
1550 \\ var e: c_int = @boolToInt((a <= b));
1551 \\ var f: c_int = @boolToInt((a >= b));
1542 \\pub export fn test_comparisons(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1543 \\ var a_1 = _arg_a_1;
1544 \\ var b_2 = _arg_b_2;
1545 \\ var c: c_int = @boolToInt((a_1 < b_2));
1546 \\ var d: c_int = @boolToInt((a_1 > b_2));
1547 \\ var e: c_int = @boolToInt((a_1 <= b_2));
1548 \\ var f: c_int = @boolToInt((a_1 >= b_2));
15521549 \\ var g: c_int = @boolToInt((c < d));
15531550 \\ var h: c_int = @boolToInt((e < f));
15541551 \\ var i: c_int = @boolToInt((g < h));
......@@ -1565,12 +1562,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15651562 \\ return a;
15661563 \\}
15671564 , &[_][]const u8{
1568 \\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
1569 \\ var a = _arg_a;
1570 \\ var b = _arg_b;
1571 \\ if (a == b) return a;
1572 \\ if (a != b) return b;
1573 \\ return a;
1565 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1566 \\ var a_1 = _arg_a_1;
1567 \\ var b_2 = _arg_b_2;
1568 \\ if (a_1 == b_2) return a_1;
1569 \\ if (a_1 != b_2) return b_2;
1570 \\ return a_1;
15741571 \\}
15751572 });
15761573
......@@ -1643,9 +1640,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
16431640 \\}
16441641 , &[_][]const u8{
16451642 \\pub export var array: [100]c_int = .{0} ** 100;
1646 \\pub export fn foo(_arg_index: c_int) c_int {
1647 \\ var index = _arg_index;
1648 \\ return array[index];
1643 \\pub export fn foo(_arg_index_1: c_int) c_int {
1644 \\ var index_1 = _arg_index_1;
1645 \\ return array[index_1];
16491646 \\}
16501647 ,
16511648 \\pub const ACCESS = array[2];
......@@ -1668,12 +1665,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
16681665 \\ return a;
16691666 \\}
16701667 , &[_][]const u8{
1671 \\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
1672 \\ var a = _arg_a;
1673 \\ var b = _arg_b;
1674 \\ if ((a < b) or (a == b)) return b;
1675 \\ if ((a >= b) and (a == b)) return a;
1676 \\ return a;
1668 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1669 \\ var a_1 = _arg_a_1;
1670 \\ var b_2 = _arg_b_2;
1671 \\ if ((a_1 < b_2) or (a_1 == b_2)) return b_2;
1672 \\ if ((a_1 >= b_2) and (a_1 == b_2)) return a_1;
1673 \\ return a_1;
16771674 \\}
16781675 });
16791676
......@@ -1690,12 +1687,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
16901687 \\ if (a < b) ; else ;
16911688 \\}
16921689 , &[_][]const u8{
1693 \\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
1694 \\ var a = _arg_a;
1695 \\ var b = _arg_b;
1696 \\ if (a < b) return b;
1697 \\ if (a < b) return b else return a;
1698 \\ if (a < b) {} else {}
1690 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1691 \\ var a_1 = _arg_a_1;
1692 \\ var b_2 = _arg_b_2;
1693 \\ if (a_1 < b_2) return b_2;
1694 \\ if (a_1 < b_2) return b_2 else return a_1;
1695 \\ if (a_1 < b_2) {} else {}
16991696 \\}
17001697 });
17011698
......@@ -1714,15 +1711,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17141711 \\ B,
17151712 \\ C,
17161713 \\};
1717 \\pub export fn if_none_bool(_arg_a: c_int, _arg_b: f32, _arg_c: ?*c_void, _arg_d: enum_SomeEnum) c_int {
1718 \\ var a = _arg_a;
1719 \\ var b = _arg_b;
1720 \\ var c = _arg_c;
1721 \\ var d = _arg_d;
1722 \\ if (a != 0) return 0;
1723 \\ if (b != 0) return 1;
1724 \\ if (c != null) return 2;
1725 \\ if (d != 0) return 3;
1714 \\pub export fn if_none_bool(_arg_a_1: c_int, _arg_b_2: f32, _arg_c_3: ?*c_void, _arg_d_4: enum_SomeEnum) c_int {
1715 \\ var a_1 = _arg_a_1;
1716 \\ var b_2 = _arg_b_2;
1717 \\ var c_3 = _arg_c_3;
1718 \\ var d_4 = _arg_d_4;
1719 \\ if (a_1 != 0) return 0;
1720 \\ if (b_2 != 0) return 1;
1721 \\ if (c_3 != null) return 2;
1722 \\ if (d_4 != 0) return 3;
17261723 \\ return 4;
17271724 \\}
17281725 });
......@@ -1744,9 +1741,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17441741 \\ return a < 0 ? -a : a;
17451742 \\}
17461743 , &[_][]const u8{
1747 \\pub export fn abs(_arg_a: c_int) c_int {
1748 \\ var a = _arg_a;
1749 \\ return if (a < 0) -a else a;
1744 \\pub export fn abs(_arg_a_1: c_int) c_int {
1745 \\ var a_1 = _arg_a_1;
1746 \\ return if (a_1 < 0) -a_1 else a_1;
17501747 \\}
17511748 });
17521749
......@@ -1760,15 +1757,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17601757 \\ return a;
17611758 \\}
17621759 , &[_][]const u8{
1763 \\pub export fn foo1(_arg_a: c_uint) c_uint {
1764 \\ var a = _arg_a;
1765 \\ a +%= 1;
1766 \\ return a;
1760 \\pub export fn foo1(_arg_a_1: c_uint) c_uint {
1761 \\ var a_1 = _arg_a_1;
1762 \\ a_1 +%= 1;
1763 \\ return a_1;
17671764 \\}
1768 \\pub export fn foo2(_arg_a: c_int) c_int {
1769 \\ var a = _arg_a;
1770 \\ a += 1;
1771 \\ return a;
1765 \\pub export fn foo2(_arg_a_2: c_int) c_int {
1766 \\ var a_2 = _arg_a_2;
1767 \\ a_2 += 1;
1768 \\ return a_2;
17721769 \\}
17731770 });
17741771
......@@ -1855,11 +1852,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
18551852 \\ return i;
18561853 \\}
18571854 , &[_][]const u8{
1858 \\pub export fn log2(_arg_a: c_uint) c_int {
1859 \\ var a = _arg_a;
1855 \\pub export fn log2(_arg_a_1: c_uint) c_int {
1856 \\ var a_1 = _arg_a_1;
18601857 \\ var i: c_int = 0;
1861 \\ while (a > @intCast(c_uint, 0)) {
1862 \\ a >>= @as(@import("std").math.Log2Int(c_int), 1);
1858 \\ while (a_1 > @intCast(c_uint, 0)) {
1859 \\ a_1 >>= @as(@import("std").math.Log2Int(c_int), 1);
18631860 \\ }
18641861 \\ return i;
18651862 \\}
......@@ -1875,11 +1872,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
18751872 \\ return i;
18761873 \\}
18771874 , &[_][]const u8{
1878 \\pub export fn log2(_arg_a: u32) c_int {
1879 \\ var a = _arg_a;
1875 \\pub export fn log2(_arg_a_1: u32) c_int {
1876 \\ var a_1 = _arg_a_1;
18801877 \\ var i: c_int = 0;
1881 \\ while (a > @intCast(c_uint, 0)) {
1882 \\ a >>= @as(@import("std").math.Log2Int(c_int), 1);
1878 \\ while (a_1 > @intCast(c_uint, 0)) {
1879 \\ a_1 >>= @as(@import("std").math.Log2Int(c_int), 1);
18831880 \\ }
18841881 \\ return i;
18851882 \\}
......@@ -2059,7 +2056,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20592056 \\void fn_bool(bool x);
20602057 \\void fn_ptr(void *x);
20612058 \\
2062 \\void call(int q) {
2059 \\void call() {
20632060 \\ fn_int(3.0f);
20642061 \\ fn_int(3.0);
20652062 \\ fn_int(3.0L);
......@@ -2084,8 +2081,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20842081 \\pub extern fn fn_char(x: u8) void;
20852082 \\pub extern fn fn_bool(x: bool) void;
20862083 \\pub extern fn fn_ptr(x: ?*c_void) void;
2087 \\pub export fn call(_arg_q: c_int) void {
2088 \\ var q = _arg_q;
2084 \\pub export fn call() void {
20892085 \\ fn_int(@floatToInt(c_int, 3));
20902086 \\ fn_int(@floatToInt(c_int, 3));
20912087 \\ fn_int(@floatToInt(c_int, 3));
......@@ -2113,10 +2109,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
21132109 \\}
21142110 , &[_][]const u8{
21152111 \\pub fn bar() void {}
2116 \\pub export fn foo(_arg_baz: ?extern fn () [*c]c_int) void {
2117 \\ var baz = _arg_baz;
2112 \\pub export fn foo(_arg_baz_1: ?extern fn () [*c]c_int) void {
2113 \\ var baz_1 = _arg_baz_1;
21182114 \\ bar();
2119 \\ _ = baz.?();
2115 \\ _ = baz_1.?();
21202116 \\}
21212117 });
21222118