authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-31 20:39:33-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-31 20:39:33-05:00
log42945a269ad5d746eed1acb20696723d18ec8653
tree5f243d0d9ecf6330f6bbca0872f6fa37f8ff6176
parent5749f706ef866b3c77d6fb8fda9ed08e5c118f58
signature Commit is signed but in an unrecognized format.

translate-c: better mangling strategy

Block-local identifiers have block-local mangling numbers, and more consistent mangling is applied within blocks. Parameters, for example, are treated the same as other block-local variables, and are not mangled unless they conflict with another name in scope.

2 files changed, 228 insertions(+), 227 deletions(-)

src-self-hosted/translate_c.zig+44-43
......@@ -64,6 +64,7 @@ const Scope = struct {
6464 block_node: *ast.Node.Block,
6565 variables: AliasList,
6666 label: ?[]const u8,
67 mangle_count: u32 = 0,
6768
6869 /// Don't forget to set rbrace token and block_node later
6970 fn init(c: *Context, parent: *Scope, label: ?[]const u8) !*Block {
......@@ -80,7 +81,18 @@ const Scope = struct {
8081 return block;
8182 }
8283
83 fn getAlias(scope: *Block, name: []const u8) ?[]const u8 {
84 /// Given the desired name, return a name that does not shadow anything from outer scopes.
85 fn makeMangledName(scope: *Block, c: *Context, name: []const u8) ![]const u8 {
86 var proposed_name = name;
87 while (scope.contains(proposed_name)) {
88 scope.mangle_count += 1;
89 proposed_name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ name, scope.mangle_count });
90 }
91 try scope.variables.push(.{ .name = name, .alias = proposed_name });
92 return proposed_name;
93 }
94
95 fn getAlias(scope: *Block, name: []const u8) []const u8 {
8496 var it = scope.variables.iterator(0);
8597 while (it.next()) |p| {
8698 if (mem.eql(u8, p.name, name))
......@@ -89,12 +101,18 @@ const Scope = struct {
89101 return scope.base.parent.?.getAlias(name);
90102 }
91103
92 fn contains(scope: *Block, name: []const u8) bool {
104 fn localContains(scope: *Block, name: []const u8) bool {
93105 var it = scope.variables.iterator(0);
94106 while (it.next()) |p| {
95107 if (mem.eql(u8, p.name, name))
96108 return true;
97109 }
110 return false;
111 }
112
113 fn contains(scope: *Block, name: []const u8) bool {
114 if (scope.localContains(name))
115 return true;
98116 return scope.base.parent.?.contains(name);
99117 }
100118 };
......@@ -116,7 +134,9 @@ const Scope = struct {
116134 }
117135
118136 fn contains(scope: *Root, name: []const u8) bool {
119 return scope.sym_table.contains(name) or scope.macro_table.contains(name);
137 return isZigPrimitiveType(name) or
138 scope.sym_table.contains(name) or
139 scope.macro_table.contains(name);
120140 }
121141 };
122142
......@@ -135,16 +155,9 @@ const Scope = struct {
135155 }
136156 }
137157
138 fn createAlias(scope: *Scope, c: *Context, name: []const u8) !?[]const u8 {
139 if (isZigPrimitiveType(name) or scope.contains(name)) {
140 return try std.fmt.allocPrint(c.a(), "{}_{}", .{ name, c.getMangle() });
141 }
142 return null;
143 }
144
145 fn getAlias(scope: *Scope, name: []const u8) ?[]const u8 {
158 fn getAlias(scope: *Scope, name: []const u8) []const u8 {
146159 return switch (scope.id) {
147 .Root => null,
160 .Root => return name,
148161 .Block => @fieldParentPtr(Block, "base", scope).getAlias(name),
149162 .Switch, .Loop, .Condition => scope.parent.?.getAlias(name),
150163 };
......@@ -191,9 +204,9 @@ pub const Context = struct {
191204 alias_list: AliasList,
192205 global_scope: *Scope.Root,
193206 clang_context: *ZigClangASTContext,
194 mangle_count: u64 = 0,
207 mangle_count: u32 = 0,
195208
196 fn getMangle(c: *Context) u64 {
209 fn getMangle(c: *Context) u32 {
197210 c.mangle_count += 1;
198211 return c.mangle_count;
199212 }
......@@ -410,19 +423,14 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
410423 const param_name = tokenSlice(c, param.name_token orelse
411424 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name}));
412425
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 });
426 const mangled_param_name = try block_scope.makeMangledName(c, param_name);
416427
417428 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;
429 const bare_arg_name = try std.fmt.allocPrint(c.a(), "arg_{}", .{mangled_param_name});
430 break :blk try block_scope.makeMangledName(c, bare_arg_name);
423431 };
424432
425 const node = try transCreateNodeVarDecl(c, false, false, checked_param_name);
433 const node = try transCreateNodeVarDecl(c, false, false, mangled_param_name);
426434 node.eq_token = try appendToken(c, .Equal, "=");
427435 node.init_node = try transCreateNodeIdentifier(c, arg_name);
428436 node.semicolon_token = try appendToken(c, .Semicolon, ";");
......@@ -1143,11 +1151,8 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
11431151 const name = try c.str(ZigClangDecl_getName_bytes_begin(
11441152 @ptrCast(*const ZigClangDecl, var_decl),
11451153 ));
1146 const checked_name = if (try scope.createAlias(c, name)) |a| blk: {
1147 try block_scope.variables.push(.{ .name = name, .alias = a });
1148 break :blk a;
1149 } else name;
1150 const node = try transCreateNodeVarDecl(c, false, ZigClangQualType_isConstQualified(qual_type), checked_name);
1154 const mangled_name = try block_scope.makeMangledName(c, name);
1155 const node = try transCreateNodeVarDecl(c, false, ZigClangQualType_isConstQualified(qual_type), mangled_name);
11511156
11521157 _ = try appendToken(c, .Colon, ":");
11531158 const loc = ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt));
......@@ -1188,8 +1193,8 @@ fn transDeclRefExpr(
11881193) TransError!*ast.Node {
11891194 const value_decl = ZigClangDeclRefExpr_getDecl(expr);
11901195 const name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl)));
1191 const checked_name = if (scope.getAlias(name)) |a| a else name;
1192 return transCreateNodeIdentifier(rp.c, checked_name);
1196 const mangled_name = scope.getAlias(name);
1197 return transCreateNodeIdentifier(rp.c, mangled_name);
11931198}
11941199
11951200fn transImplicitCastExpr(
......@@ -2318,7 +2323,7 @@ fn transCreatePreCrement(
23182323 // zig: })
23192324 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
23202325 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
2321 const ref = try std.fmt.allocPrint(rp.c.a(), "_ref_{}", .{rp.c.getMangle()});
2326 const ref = try block_scope.makeMangledName(rp.c, "ref");
23222327
23232328 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);
23242329 node.eq_token = try appendToken(rp.c, .Equal, "=");
......@@ -2383,7 +2388,7 @@ fn transCreatePostCrement(
23832388 // zig: })
23842389 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
23852390 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
2386 const ref = try std.fmt.allocPrint(rp.c.a(), "_ref_{}", .{rp.c.getMangle()});
2391 const ref = try block_scope.makeMangledName(rp.c, "ref");
23872392
23882393 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);
23892394 node.eq_token = try appendToken(rp.c, .Equal, "=");
......@@ -2397,7 +2402,7 @@ fn transCreatePostCrement(
23972402 const ref_node = try transCreateNodePtrDeref(rp.c, lhs_node);
23982403 _ = try appendToken(rp.c, .Semicolon, ";");
23992404
2400 const tmp = try std.fmt.allocPrint(rp.c.a(), "_tmp_{}", .{rp.c.getMangle()});
2405 const tmp = try block_scope.makeMangledName(rp.c, "tmp");
24012406 const tmp_node = try transCreateNodeVarDecl(rp.c, false, true, tmp);
24022407 tmp_node.eq_token = try appendToken(rp.c, .Equal, "=");
24032408 tmp_node.init_node = ref_node;
......@@ -2499,7 +2504,7 @@ fn transCreateCompoundAssign(
24992504 // zig: })
25002505 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
25012506 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
2502 const ref = try std.fmt.allocPrint(rp.c.a(), "_ref_{}", .{rp.c.getMangle()});
2507 const ref = try block_scope.makeMangledName(rp.c, "ref");
25032508
25042509 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);
25052510 node.eq_token = try appendToken(rp.c, .Equal, "=");
......@@ -2962,7 +2967,7 @@ fn transCreateNodeAssign(
29622967 // zig: })
29632968 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
29642969 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
2965 const tmp = try std.fmt.allocPrint(rp.c.a(), "_tmp_{}", .{rp.c.getMangle()});
2970 const tmp = try block_scope.makeMangledName(rp.c, "tmp");
29662971
29672972 const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);
29682973 node.eq_token = try appendToken(rp.c, .Equal, "=");
......@@ -4198,12 +4203,8 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
41984203 );
41994204 }
42004205
4201 const checked_name = if (try scope.createAlias(c, param_tok.bytes)) |alias| blk: {
4202 try block_scope.variables.push(.{ .name = param_tok.bytes, .alias = alias });
4203 break :blk alias;
4204 } else param_tok.bytes;
4205
4206 const param_name_tok = try appendIdentifier(c, checked_name);
4206 const mangled_name = try block_scope.makeMangledName(c, param_tok.bytes);
4207 const param_name_tok = try appendIdentifier(c, mangled_name);
42074208 _ = try appendToken(c, .Colon, ":");
42084209
42094210 const token_index = try appendToken(c, .Keyword_var, "var");
......@@ -4384,8 +4385,8 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
43844385 return parseCNumLit(c, tok, source_loc);
43854386 },
43864387 .Identifier => {
4387 const name = if (scope.getAlias(tok.bytes)) |a| a else tok.bytes;
4388 return transCreateNodeIdentifier(c, name);
4388 const mangled_name = scope.getAlias(tok.bytes);
4389 return transCreateNodeIdentifier(c, mangled_name);
43894390 },
43904391 .LParen => {
43914392 const inner_node = try parseCExpr(c, it, source_loc, scope);
test/translate_c.zig+184-184
......@@ -1106,8 +1106,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11061106 \\pub var a: c_long = @intCast(c_long, 2);
11071107 \\pub var b: c_long = @intCast(c_long, 2);
11081108 \\pub var c: c_int = 4;
1109 \\pub export fn foo(_arg_c_1: u8) void {
1110 \\ var c_1 = _arg_c_1;
1109 \\pub export fn foo(arg_c_1: u8) void {
1110 \\ var c_1 = arg_c_1;
11111111 \\ var a_2: c_int = undefined;
11121112 \\ var b_3: u8 = @intCast(u8, 123);
11131113 \\ b_3 = @intCast(u8, a_2);
......@@ -1144,9 +1144,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11441144 \\ var a: c_int = undefined;
11451145 \\ var b: c_int = undefined;
11461146 \\ a = blk: {
1147 \\ const _tmp_1 = 2;
1148 \\ b = _tmp_1;
1149 \\ break :blk _tmp_1;
1147 \\ const tmp = 2;
1148 \\ b = tmp;
1149 \\ break :blk tmp;
11501150 \\ };
11511151 \\}
11521152 });
......@@ -1197,14 +1197,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11971197 \\ var a: c_int = 5;
11981198 \\ while (2 != 0) a = 2;
11991199 \\ while (4 != 0) {
1200 \\ var a: c_int = 4;
1201 \\ a = 9;
1200 \\ var a_1: c_int = 4;
1201 \\ a_1 = 9;
12021202 \\ _ = 6;
1203 \\ return a;
1203 \\ return a_1;
12041204 \\ }
12051205 \\ while (true) {
1206 \\ var a: c_int = 2;
1207 \\ a = 12;
1206 \\ var a_1: c_int = 2;
1207 \\ a_1 = 12;
12081208 \\ if (!(4 != 0)) break;
12091209 \\ }
12101210 \\ while (true) {
......@@ -1284,15 +1284,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
12841284 \\ }
12851285 \\}
12861286 , &[_][]const u8{
1287 \\pub export fn switch_fn(_arg_i_1: c_int) c_int {
1288 \\ var i_1 = _arg_i_1;
1287 \\pub export fn switch_fn(arg_i: c_int) c_int {
1288 \\ var i = arg_i;
12891289 \\ var res: c_int = 0;
12901290 \\ __switch: {
12911291 \\ __case_2: {
12921292 \\ __default: {
12931293 \\ __case_1: {
12941294 \\ __case_0: {
1295 \\ switch (i_1) {
1295 \\ switch (i) {
12961296 \\ 0 => break :__case_0,
12971297 \\ 1...3 => break :__case_1,
12981298 \\ else => break :__default,
......@@ -1303,7 +1303,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13031303 \\ }
13041304 \\ res = 2;
13051305 \\ }
1306 \\ res = (3 * i_1);
1306 \\ res = (3 * i);
13071307 \\ break :__switch;
13081308 \\ }
13091309 \\ res = 5;
......@@ -1346,11 +1346,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13461346 \\ a = tmp;
13471347 \\}
13481348 , &[_][]const u8{
1349 \\pub export fn max(_arg_a_1: c_int) c_int {
1350 \\ var a_1 = _arg_a_1;
1349 \\pub export fn max(arg_a: c_int) c_int {
1350 \\ var a = arg_a;
13511351 \\ var tmp: c_int = undefined;
1352 \\ tmp = a_1;
1353 \\ a_1 = tmp;
1352 \\ tmp = a;
1353 \\ a = tmp;
13541354 \\}
13551355 });
13561356
......@@ -1360,14 +1360,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13601360 \\ c = b = a;
13611361 \\}
13621362 , &[_][]const u8{
1363 \\pub export fn max(_arg_a_1: c_int) void {
1364 \\ var a_1 = _arg_a_1;
1363 \\pub export fn max(arg_a: c_int) void {
1364 \\ var a = arg_a;
13651365 \\ var b: c_int = undefined;
13661366 \\ var c: c_int = undefined;
13671367 \\ c = blk: {
1368 \\ const _tmp_2 = a_1;
1369 \\ b = _tmp_2;
1370 \\ break :blk _tmp_2;
1368 \\ const tmp = a;
1369 \\ b = tmp;
1370 \\ break :blk tmp;
13711371 \\ };
13721372 \\}
13731373 });
......@@ -1391,9 +1391,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13911391 \\ return (int)a;
13921392 \\}
13931393 , &[_][]const u8{
1394 \\pub export fn float_to_int(_arg_a_1: f32) c_int {
1395 \\ var a_1 = _arg_a_1;
1396 \\ return @floatToInt(c_int, a_1);
1394 \\pub export fn float_to_int(arg_a: f32) c_int {
1395 \\ var a = arg_a;
1396 \\ return @floatToInt(c_int, a);
13971397 \\}
13981398 });
13991399
......@@ -1487,23 +1487,23 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
14871487 \\ C,
14881488 \\};
14891489 \\pub const SomeTypedef = c_int;
1490 \\pub export fn and_or_non_bool(_arg_a_1: c_int, _arg_b_2: f32, _arg_c_3: ?*c_void) c_int {
1491 \\ var a_1 = _arg_a_1;
1492 \\ var b_2 = _arg_b_2;
1493 \\ var c_3 = _arg_c_3;
1490 \\pub export fn and_or_non_bool(arg_a: c_int, arg_b: f32, arg_c: ?*c_void) c_int {
1491 \\ var a = arg_a;
1492 \\ var b = arg_b;
1493 \\ var c = arg_c;
14941494 \\ var d: enum_Foo = @intToEnum(enum_Foo, FooA);
1495 \\ var e: c_int = @boolToInt(((a_1 != 0) and (b_2 != 0)));
1496 \\ var f: c_int = @boolToInt(((b_2 != 0) and (c_3 != null)));
1497 \\ var g: c_int = @boolToInt(((a_1 != 0) and (c_3 != null)));
1498 \\ var h: c_int = @boolToInt(((a_1 != 0) or (b_2 != 0)));
1499 \\ var i: c_int = @boolToInt(((b_2 != 0) or (c_3 != null)));
1500 \\ var j: c_int = @boolToInt(((a_1 != 0) or (c_3 != null)));
1501 \\ var k: c_int = @boolToInt(((a_1 != 0) or (@enumToInt(d) != 0)));
1502 \\ var l: c_int = @boolToInt(((@enumToInt(d) != 0) and (b_2 != 0)));
1503 \\ var m: c_int = @boolToInt(((c_3 != null) or (@enumToInt(d) != 0)));
1495 \\ var e: c_int = @boolToInt(((a != 0) and (b != 0)));
1496 \\ var f: c_int = @boolToInt(((b != 0) and (c != null)));
1497 \\ var g: c_int = @boolToInt(((a != 0) and (c != null)));
1498 \\ var h: c_int = @boolToInt(((a != 0) or (b != 0)));
1499 \\ var i: c_int = @boolToInt(((b != 0) or (c != null)));
1500 \\ var j: c_int = @boolToInt(((a != 0) or (c != null)));
1501 \\ var k: c_int = @boolToInt(((a != 0) or (@enumToInt(d) != 0)));
1502 \\ var l: c_int = @boolToInt(((@enumToInt(d) != 0) and (b != 0)));
1503 \\ var m: c_int = @boolToInt(((c != null) or (@enumToInt(d) != 0)));
15041504 \\ var td: SomeTypedef = 44;
1505 \\ var o: c_int = @boolToInt(((td != 0) or (b_2 != 0)));
1506 \\ var p: c_int = @boolToInt(((c_3 != null) and (td != 0)));
1505 \\ var o: c_int = @boolToInt(((td != 0) or (b != 0)));
1506 \\ var p: c_int = @boolToInt(((c != null) and (td != 0)));
15071507 \\ return ((((((((((e + f) + g) + h) + i) + j) + k) + l) + m) + o) + p);
15081508 \\}
15091509 ,
......@@ -1541,10 +1541,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15411541 \\ return (a & b) ^ (a | b);
15421542 \\}
15431543 , &[_][]const u8{
1544 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1545 \\ var a_1 = _arg_a_1;
1546 \\ var b_2 = _arg_b_2;
1547 \\ return ((a_1 & b_2) ^ (a_1 | b_2));
1544 \\pub export fn max(arg_a: c_int, arg_b: c_int) c_int {
1545 \\ var a = arg_a;
1546 \\ var b = arg_b;
1547 \\ return ((a & b) ^ (a | b));
15481548 \\}
15491549 });
15501550
......@@ -1560,13 +1560,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15601560 \\ return i;
15611561 \\}
15621562 , &[_][]const u8{
1563 \\pub export fn test_comparisons(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1564 \\ var a_1 = _arg_a_1;
1565 \\ var b_2 = _arg_b_2;
1566 \\ var c: c_int = @boolToInt((a_1 < b_2));
1567 \\ var d: c_int = @boolToInt((a_1 > b_2));
1568 \\ var e: c_int = @boolToInt((a_1 <= b_2));
1569 \\ var f: c_int = @boolToInt((a_1 >= b_2));
1563 \\pub export fn test_comparisons(arg_a: c_int, arg_b: c_int) c_int {
1564 \\ var a = arg_a;
1565 \\ var b = arg_b;
1566 \\ var c: c_int = @boolToInt((a < b));
1567 \\ var d: c_int = @boolToInt((a > b));
1568 \\ var e: c_int = @boolToInt((a <= b));
1569 \\ var f: c_int = @boolToInt((a >= b));
15701570 \\ var g: c_int = @boolToInt((c < d));
15711571 \\ var h: c_int = @boolToInt((e < f));
15721572 \\ var i: c_int = @boolToInt((g < h));
......@@ -1583,12 +1583,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15831583 \\ return a;
15841584 \\}
15851585 , &[_][]const u8{
1586 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1587 \\ var a_1 = _arg_a_1;
1588 \\ var b_2 = _arg_b_2;
1589 \\ if (a_1 == b_2) return a_1;
1590 \\ if (a_1 != b_2) return b_2;
1591 \\ return a_1;
1586 \\pub export fn max(arg_a: c_int, arg_b: c_int) c_int {
1587 \\ var a = arg_a;
1588 \\ var b = arg_b;
1589 \\ if (a == b) return a;
1590 \\ if (a != b) return b;
1591 \\ return a;
15921592 \\}
15931593 });
15941594
......@@ -1661,9 +1661,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
16611661 \\}
16621662 , &[_][]const u8{
16631663 \\pub export var array: [100]c_int = .{0} ** 100;
1664 \\pub export fn foo(_arg_index_1: c_int) c_int {
1665 \\ var index_1 = _arg_index_1;
1666 \\ return array[index_1];
1664 \\pub export fn foo(arg_index: c_int) c_int {
1665 \\ var index = arg_index;
1666 \\ return array[index];
16671667 \\}
16681668 ,
16691669 \\pub const ACCESS = array[2];
......@@ -1686,12 +1686,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
16861686 \\ return a;
16871687 \\}
16881688 , &[_][]const u8{
1689 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1690 \\ var a_1 = _arg_a_1;
1691 \\ var b_2 = _arg_b_2;
1692 \\ if ((a_1 < b_2) or (a_1 == b_2)) return b_2;
1693 \\ if ((a_1 >= b_2) and (a_1 == b_2)) return a_1;
1694 \\ return a_1;
1689 \\pub export fn max(arg_a: c_int, arg_b: c_int) c_int {
1690 \\ var a = arg_a;
1691 \\ var b = arg_b;
1692 \\ if ((a < b) or (a == b)) return b;
1693 \\ if ((a >= b) and (a == b)) return a;
1694 \\ return a;
16951695 \\}
16961696 });
16971697
......@@ -1708,12 +1708,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17081708 \\ if (a < b) ; else ;
17091709 \\}
17101710 , &[_][]const u8{
1711 \\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
1712 \\ var a_1 = _arg_a_1;
1713 \\ var b_2 = _arg_b_2;
1714 \\ if (a_1 < b_2) return b_2;
1715 \\ if (a_1 < b_2) return b_2 else return a_1;
1716 \\ if (a_1 < b_2) {} else {}
1711 \\pub export fn max(arg_a: c_int, arg_b: c_int) c_int {
1712 \\ var a = arg_a;
1713 \\ var b = arg_b;
1714 \\ if (a < b) return b;
1715 \\ if (a < b) return b else return a;
1716 \\ if (a < b) {} else {}
17171717 \\}
17181718 });
17191719
......@@ -1732,15 +1732,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17321732 \\ B,
17331733 \\ C,
17341734 \\};
1735 \\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 {
1736 \\ var a_1 = _arg_a_1;
1737 \\ var b_2 = _arg_b_2;
1738 \\ var c_3 = _arg_c_3;
1739 \\ var d_4 = _arg_d_4;
1740 \\ if (a_1 != 0) return 0;
1741 \\ if (b_2 != 0) return 1;
1742 \\ if (c_3 != null) return 2;
1743 \\ if (d_4 != 0) return 3;
1735 \\pub export fn if_none_bool(arg_a: c_int, arg_b: f32, arg_c: ?*c_void, arg_d: enum_SomeEnum) c_int {
1736 \\ var a = arg_a;
1737 \\ var b = arg_b;
1738 \\ var c = arg_c;
1739 \\ var d = arg_d;
1740 \\ if (a != 0) return 0;
1741 \\ if (b != 0) return 1;
1742 \\ if (c != null) return 2;
1743 \\ if (d != 0) return 3;
17441744 \\ return 4;
17451745 \\}
17461746 });
......@@ -1762,9 +1762,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17621762 \\ return a < 0 ? -a : a;
17631763 \\}
17641764 , &[_][]const u8{
1765 \\pub export fn abs(_arg_a_1: c_int) c_int {
1766 \\ var a_1 = _arg_a_1;
1767 \\ return if (a_1 < 0) -a_1 else a_1;
1765 \\pub export fn abs(arg_a: c_int) c_int {
1766 \\ var a = arg_a;
1767 \\ return if (a < 0) -a else a;
17681768 \\}
17691769 });
17701770
......@@ -1782,20 +1782,20 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17821782 \\ return a;
17831783 \\}
17841784 , &[_][]const u8{
1785 \\pub export fn foo1(_arg_a_1: c_uint) c_uint {
1786 \\ var a_1 = _arg_a_1;
1787 \\ a_1 +%= 1;
1788 \\ return a_1;
1785 \\pub export fn foo1(arg_a: c_uint) c_uint {
1786 \\ var a = arg_a;
1787 \\ a +%= 1;
1788 \\ return a;
17891789 \\}
1790 \\pub export fn foo2(_arg_a_2: c_int) c_int {
1791 \\ var a_2 = _arg_a_2;
1792 \\ a_2 += 1;
1793 \\ return a_2;
1790 \\pub export fn foo2(arg_a: c_int) c_int {
1791 \\ var a = arg_a;
1792 \\ a += 1;
1793 \\ return a;
17941794 \\}
1795 \\pub export fn foo3(_arg_a_3: [*c]c_int) [*c]c_int {
1796 \\ var a_3 = _arg_a_3;
1797 \\ a_3 += 1;
1798 \\ return a_3;
1795 \\pub export fn foo3(arg_a: [*c]c_int) [*c]c_int {
1796 \\ var a = arg_a;
1797 \\ a += 1;
1798 \\ return a;
17991799 \\}
18001800 });
18011801
......@@ -1851,24 +1851,24 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
18511851 \\ u +%= 1;
18521852 \\ u -%= 1;
18531853 \\ i = (blk: {
1854 \\ const _ref_1 = &i;
1855 \\ _ref_1.* += 1;
1856 \\ break :blk _ref_1.*;
1854 \\ const ref = &i;
1855 \\ ref.* += 1;
1856 \\ break :blk ref.*;
18571857 \\ });
18581858 \\ i = (blk: {
1859 \\ const _ref_2 = &i;
1860 \\ _ref_2.* -= 1;
1861 \\ break :blk _ref_2.*;
1859 \\ const ref = &i;
1860 \\ ref.* -= 1;
1861 \\ break :blk ref.*;
18621862 \\ });
18631863 \\ u = (blk: {
1864 \\ const _ref_3 = &u;
1865 \\ _ref_3.* +%= 1;
1866 \\ break :blk _ref_3.*;
1864 \\ const ref = &u;
1865 \\ ref.* +%= 1;
1866 \\ break :blk ref.*;
18671867 \\ });
18681868 \\ u = (blk: {
1869 \\ const _ref_4 = &u;
1870 \\ _ref_4.* -%= 1;
1871 \\ break :blk _ref_4.*;
1869 \\ const ref = &u;
1870 \\ ref.* -%= 1;
1871 \\ break :blk ref.*;
18721872 \\ });
18731873 \\}
18741874 });
......@@ -1882,11 +1882,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
18821882 \\ return i;
18831883 \\}
18841884 , &[_][]const u8{
1885 \\pub export fn log2(_arg_a_1: c_uint) c_int {
1886 \\ var a_1 = _arg_a_1;
1885 \\pub export fn log2(arg_a: c_uint) c_int {
1886 \\ var a = arg_a;
18871887 \\ var i: c_int = 0;
1888 \\ while (a_1 > @intCast(c_uint, 0)) {
1889 \\ a_1 >>= @as(@import("std").math.Log2Int(c_int), 1);
1888 \\ while (a > @intCast(c_uint, 0)) {
1889 \\ a >>= @as(@import("std").math.Log2Int(c_int), 1);
18901890 \\ }
18911891 \\ return i;
18921892 \\}
......@@ -1902,11 +1902,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
19021902 \\ return i;
19031903 \\}
19041904 , &[_][]const u8{
1905 \\pub export fn log2(_arg_a_1: u32) c_int {
1906 \\ var a_1 = _arg_a_1;
1905 \\pub export fn log2(arg_a: u32) c_int {
1906 \\ var a = arg_a;
19071907 \\ var i: c_int = 0;
1908 \\ while (a_1 > @intCast(c_uint, 0)) {
1909 \\ a_1 >>= @as(@import("std").math.Log2Int(c_int), 1);
1908 \\ while (a > @intCast(c_uint, 0)) {
1909 \\ a >>= @as(@import("std").math.Log2Int(c_int), 1);
19101910 \\ }
19111911 \\ return i;
19121912 \\}
......@@ -1928,44 +1928,44 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
19281928 \\pub export fn foo() void {
19291929 \\ var a: c_int = 0;
19301930 \\ a += (blk: {
1931 \\ const _ref_1 = &a;
1932 \\ _ref_1.* = _ref_1.* + 1;
1933 \\ break :blk _ref_1.*;
1931 \\ const ref = &a;
1932 \\ ref.* = ref.* + 1;
1933 \\ break :blk ref.*;
19341934 \\ });
19351935 \\ a -= (blk: {
1936 \\ const _ref_2 = &a;
1937 \\ _ref_2.* = _ref_2.* - 1;
1938 \\ break :blk _ref_2.*;
1936 \\ const ref = &a;
1937 \\ ref.* = ref.* - 1;
1938 \\ break :blk ref.*;
19391939 \\ });
19401940 \\ a *= (blk: {
1941 \\ const _ref_3 = &a;
1942 \\ _ref_3.* = _ref_3.* * 1;
1943 \\ break :blk _ref_3.*;
1941 \\ const ref = &a;
1942 \\ ref.* = ref.* * 1;
1943 \\ break :blk ref.*;
19441944 \\ });
19451945 \\ a &= (blk: {
1946 \\ const _ref_4 = &a;
1947 \\ _ref_4.* = _ref_4.* & 1;
1948 \\ break :blk _ref_4.*;
1946 \\ const ref = &a;
1947 \\ ref.* = ref.* & 1;
1948 \\ break :blk ref.*;
19491949 \\ });
19501950 \\ a |= (blk: {
1951 \\ const _ref_5 = &a;
1952 \\ _ref_5.* = _ref_5.* | 1;
1953 \\ break :blk _ref_5.*;
1951 \\ const ref = &a;
1952 \\ ref.* = ref.* | 1;
1953 \\ break :blk ref.*;
19541954 \\ });
19551955 \\ a ^= (blk: {
1956 \\ const _ref_6 = &a;
1957 \\ _ref_6.* = _ref_6.* ^ 1;
1958 \\ break :blk _ref_6.*;
1956 \\ const ref = &a;
1957 \\ ref.* = ref.* ^ 1;
1958 \\ break :blk ref.*;
19591959 \\ });
19601960 \\ a >>= @as(@import("std").math.Log2Int(c_int), (blk: {
1961 \\ const _ref_7 = &a;
1962 \\ _ref_7.* = _ref_7.* >> @as(@import("std").math.Log2Int(c_int), 1);
1963 \\ break :blk _ref_7.*;
1961 \\ const ref = &a;
1962 \\ ref.* = ref.* >> @as(@import("std").math.Log2Int(c_int), 1);
1963 \\ break :blk ref.*;
19641964 \\ }));
19651965 \\ a <<= @as(@import("std").math.Log2Int(c_int), (blk: {
1966 \\ const _ref_8 = &a;
1967 \\ _ref_8.* = _ref_8.* << @as(@import("std").math.Log2Int(c_int), 1);
1968 \\ break :blk _ref_8.*;
1966 \\ const ref = &a;
1967 \\ ref.* = ref.* << @as(@import("std").math.Log2Int(c_int), 1);
1968 \\ break :blk ref.*;
19691969 \\ }));
19701970 \\}
19711971 });
......@@ -1986,44 +1986,44 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
19861986 \\pub export fn foo() void {
19871987 \\ var a: c_uint = @intCast(c_uint, 0);
19881988 \\ a +%= (blk: {
1989 \\ const _ref_1 = &a;
1990 \\ _ref_1.* = _ref_1.* +% @intCast(c_uint, 1);
1991 \\ break :blk _ref_1.*;
1989 \\ const ref = &a;
1990 \\ ref.* = ref.* +% @intCast(c_uint, 1);
1991 \\ break :blk ref.*;
19921992 \\ });
19931993 \\ a -%= (blk: {
1994 \\ const _ref_2 = &a;
1995 \\ _ref_2.* = _ref_2.* -% @intCast(c_uint, 1);
1996 \\ break :blk _ref_2.*;
1994 \\ const ref = &a;
1995 \\ ref.* = ref.* -% @intCast(c_uint, 1);
1996 \\ break :blk ref.*;
19971997 \\ });
19981998 \\ a *%= (blk: {
1999 \\ const _ref_3 = &a;
2000 \\ _ref_3.* = _ref_3.* *% @intCast(c_uint, 1);
2001 \\ break :blk _ref_3.*;
1999 \\ const ref = &a;
2000 \\ ref.* = ref.* *% @intCast(c_uint, 1);
2001 \\ break :blk ref.*;
20022002 \\ });
20032003 \\ a &= (blk: {
2004 \\ const _ref_4 = &a;
2005 \\ _ref_4.* = _ref_4.* & @intCast(c_uint, 1);
2006 \\ break :blk _ref_4.*;
2004 \\ const ref = &a;
2005 \\ ref.* = ref.* & @intCast(c_uint, 1);
2006 \\ break :blk ref.*;
20072007 \\ });
20082008 \\ a |= (blk: {
2009 \\ const _ref_5 = &a;
2010 \\ _ref_5.* = _ref_5.* | @intCast(c_uint, 1);
2011 \\ break :blk _ref_5.*;
2009 \\ const ref = &a;
2010 \\ ref.* = ref.* | @intCast(c_uint, 1);
2011 \\ break :blk ref.*;
20122012 \\ });
20132013 \\ a ^= (blk: {
2014 \\ const _ref_6 = &a;
2015 \\ _ref_6.* = _ref_6.* ^ @intCast(c_uint, 1);
2016 \\ break :blk _ref_6.*;
2014 \\ const ref = &a;
2015 \\ ref.* = ref.* ^ @intCast(c_uint, 1);
2016 \\ break :blk ref.*;
20172017 \\ });
20182018 \\ a >>= @as(@import("std").math.Log2Int(c_uint), (blk: {
2019 \\ const _ref_7 = &a;
2020 \\ _ref_7.* = _ref_7.* >> @as(@import("std").math.Log2Int(c_int), 1);
2021 \\ break :blk _ref_7.*;
2019 \\ const ref = &a;
2020 \\ ref.* = ref.* >> @as(@import("std").math.Log2Int(c_int), 1);
2021 \\ break :blk ref.*;
20222022 \\ }));
20232023 \\ a <<= @as(@import("std").math.Log2Int(c_uint), (blk: {
2024 \\ const _ref_8 = &a;
2025 \\ _ref_8.* = _ref_8.* << @as(@import("std").math.Log2Int(c_int), 1);
2026 \\ break :blk _ref_8.*;
2024 \\ const ref = &a;
2025 \\ ref.* = ref.* << @as(@import("std").math.Log2Int(c_int), 1);
2026 \\ break :blk ref.*;
20272027 \\ }));
20282028 \\}
20292029 });
......@@ -2050,28 +2050,28 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20502050 \\ u +%= 1;
20512051 \\ u -%= 1;
20522052 \\ i = (blk: {
2053 \\ const _ref_1 = &i;
2054 \\ const _tmp_2 = _ref_1.*;
2055 \\ _ref_1.* += 1;
2056 \\ break :blk _tmp_2;
2053 \\ const ref = &i;
2054 \\ const tmp = ref.*;
2055 \\ ref.* += 1;
2056 \\ break :blk tmp;
20572057 \\ });
20582058 \\ i = (blk: {
2059 \\ const _ref_3 = &i;
2060 \\ const _tmp_4 = _ref_3.*;
2061 \\ _ref_3.* -= 1;
2062 \\ break :blk _tmp_4;
2059 \\ const ref = &i;
2060 \\ const tmp = ref.*;
2061 \\ ref.* -= 1;
2062 \\ break :blk tmp;
20632063 \\ });
20642064 \\ u = (blk: {
2065 \\ const _ref_5 = &u;
2066 \\ const _tmp_6 = _ref_5.*;
2067 \\ _ref_5.* +%= 1;
2068 \\ break :blk _tmp_6;
2065 \\ const ref = &u;
2066 \\ const tmp = ref.*;
2067 \\ ref.* +%= 1;
2068 \\ break :blk tmp;
20692069 \\ });
20702070 \\ u = (blk: {
2071 \\ const _ref_7 = &u;
2072 \\ const _tmp_8 = _ref_7.*;
2073 \\ _ref_7.* -%= 1;
2074 \\ break :blk _tmp_8;
2071 \\ const ref = &u;
2072 \\ const tmp = ref.*;
2073 \\ ref.* -%= 1;
2074 \\ break :blk tmp;
20752075 \\ });
20762076 \\}
20772077 });
......@@ -2139,10 +2139,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
21392139 \\}
21402140 , &[_][]const u8{
21412141 \\pub fn bar() void {}
2142 \\pub export fn foo(_arg_baz_1: ?extern fn () [*c]c_int) void {
2143 \\ var baz_1 = _arg_baz_1;
2142 \\pub export fn foo(arg_baz: ?extern fn () [*c]c_int) void {
2143 \\ var baz = arg_baz;
21442144 \\ bar();
2145 \\ _ = baz_1.?();
2145 \\ _ = baz.?();
21462146 \\}
21472147 });
21482148