translate-c fix bugs
Thanks @daurnimator
This commit is contained in:
parent
59cc7072e2
commit
f5e7d2d00c
@ -643,7 +643,7 @@ fn renderExpression(
|
||||
},
|
||||
|
||||
.ArrayAccess => |index_expr| {
|
||||
const lbracket = tree.prevToken(index_expr.firstToken());
|
||||
const lbracket = tree.nextToken(suffix_op.lhs.node.lastToken());
|
||||
const rbracket = tree.nextToken(index_expr.lastToken());
|
||||
|
||||
try renderExpression(allocator, stream, tree, indent, start_col, suffix_op.lhs.node, Space.None);
|
||||
|
@ -410,11 +410,17 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
|
||||
const param_name = tokenSlice(c, param.name_token orelse
|
||||
return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name}));
|
||||
|
||||
const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: {
|
||||
try block_scope.variables.push(.{ .name = param_name, .alias = a });
|
||||
break :blk a;
|
||||
} else param_name;
|
||||
const arg_name = try std.fmt.allocPrint(c.a(), "_arg_{}", .{checked_param_name});
|
||||
// in Zig top level declarations are order-independent so this might be shadowed later
|
||||
const checked_param_name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ param_name, c.getMangle() });
|
||||
try block_scope.variables.push(.{ .name = param_name, .alias = checked_param_name });
|
||||
|
||||
const arg_name = blk: {
|
||||
const bare_arg_name = try std.fmt.allocPrint(c.a(), "_arg_{}", .{checked_param_name});
|
||||
break :blk if (try scope.createAlias(rp.c, bare_arg_name)) |a|
|
||||
a
|
||||
else
|
||||
bare_arg_name;
|
||||
};
|
||||
|
||||
const node = try transCreateNodeVarDecl(c, false, false, checked_param_name);
|
||||
node.eq_token = try appendToken(c, .Equal, "=");
|
||||
@ -533,49 +539,53 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error
|
||||
|
||||
const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
|
||||
|
||||
if (mem.eql(u8, typedef_name, "uint8_t"))
|
||||
// TODO https://github.com/ziglang/zig/issues/3756
|
||||
// TODO https://github.com/ziglang/zig/issues/1802
|
||||
const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "_{}", .{typedef_name}) else typedef_name;
|
||||
|
||||
if (mem.eql(u8, checked_name, "uint8_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "u8")
|
||||
else if (mem.eql(u8, typedef_name, "int8_t"))
|
||||
else if (mem.eql(u8, checked_name, "int8_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "i8")
|
||||
else if (mem.eql(u8, typedef_name, "uint16_t"))
|
||||
else if (mem.eql(u8, checked_name, "uint16_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "u16")
|
||||
else if (mem.eql(u8, typedef_name, "int16_t"))
|
||||
else if (mem.eql(u8, checked_name, "int16_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "i16")
|
||||
else if (mem.eql(u8, typedef_name, "uint32_t"))
|
||||
else if (mem.eql(u8, checked_name, "uint32_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "u32")
|
||||
else if (mem.eql(u8, typedef_name, "int32_t"))
|
||||
else if (mem.eql(u8, checked_name, "int32_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "i32")
|
||||
else if (mem.eql(u8, typedef_name, "uint64_t"))
|
||||
else if (mem.eql(u8, checked_name, "uint64_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "u64")
|
||||
else if (mem.eql(u8, typedef_name, "int64_t"))
|
||||
else if (mem.eql(u8, checked_name, "int64_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "i64")
|
||||
else if (mem.eql(u8, typedef_name, "intptr_t"))
|
||||
else if (mem.eql(u8, checked_name, "intptr_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "isize")
|
||||
else if (mem.eql(u8, typedef_name, "uintptr_t"))
|
||||
else if (mem.eql(u8, checked_name, "uintptr_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "usize")
|
||||
else if (mem.eql(u8, typedef_name, "ssize_t"))
|
||||
else if (mem.eql(u8, checked_name, "ssize_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "isize")
|
||||
else if (mem.eql(u8, typedef_name, "size_t"))
|
||||
else if (mem.eql(u8, checked_name, "size_t"))
|
||||
return transTypeDefAsBuiltin(c, typedef_decl, "usize");
|
||||
|
||||
_ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
|
||||
_ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);
|
||||
const visib_tok = try appendToken(c, .Keyword_pub, "pub");
|
||||
const const_tok = try appendToken(c, .Keyword_const, "const");
|
||||
const node = try transCreateNodeVarDecl(c, true, true, typedef_name);
|
||||
const node = try transCreateNodeVarDecl(c, true, true, checked_name);
|
||||
node.eq_token = try appendToken(c, .Equal, "=");
|
||||
|
||||
const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
|
||||
const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl);
|
||||
node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) {
|
||||
error.UnsupportedType => {
|
||||
try failDecl(c, typedef_loc, typedef_name, "unable to resolve typedef child type", .{});
|
||||
try failDecl(c, typedef_loc, checked_name, "unable to resolve typedef child type", .{});
|
||||
return null;
|
||||
},
|
||||
error.OutOfMemory => |e| return e,
|
||||
};
|
||||
node.semicolon_token = try appendToken(c, .Semicolon, ";");
|
||||
try addTopLevelDecl(c, typedef_name, &node.base);
|
||||
return transCreateNodeIdentifier(c, typedef_name);
|
||||
try addTopLevelDecl(c, checked_name, &node.base);
|
||||
return transCreateNodeIdentifier(c, checked_name);
|
||||
}
|
||||
|
||||
fn 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
|
||||
_ = try appendToken(c, .RParen, ")");
|
||||
|
||||
const type_of = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
|
||||
type_of.rparen_token = try appendToken(c, .LParen, ")");
|
||||
type_of.rparen_token = try appendToken(c, .RParen, ")");
|
||||
|
||||
const fn_proto = try c.a().create(ast.Node.FnProto);
|
||||
fn_proto.* = .{
|
||||
@ -4383,8 +4393,8 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
|
||||
const type_of_1 = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
|
||||
try type_id_1.params.push(&type_of_1.base);
|
||||
try type_of_1.params.push(node_to_cast);
|
||||
type_of_1.rparen_token = try appendToken(c, .LParen, ")");
|
||||
type_id_1.rparen_token = try appendToken(c, .LParen, ")");
|
||||
type_of_1.rparen_token = try appendToken(c, .RParen, ")");
|
||||
type_id_1.rparen_token = try appendToken(c, .RParen, ")");
|
||||
|
||||
const cmp_1 = try c.a().create(ast.Node.InfixOp);
|
||||
cmp_1.* = .{
|
||||
@ -4394,12 +4404,12 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
|
||||
.rhs = try transCreateNodeEnumLiteral(c, "Pointer"),
|
||||
};
|
||||
if_1.condition = &cmp_1.base;
|
||||
_ = try appendToken(c, .LParen, ")");
|
||||
_ = try appendToken(c, .RParen, ")");
|
||||
|
||||
const ptr_cast = try transCreateNodeBuiltinFnCall(c, "@ptrCast");
|
||||
try ptr_cast.params.push(inner_node);
|
||||
try ptr_cast.params.push(node_to_cast);
|
||||
ptr_cast.rparen_token = try appendToken(c, .LParen, ")");
|
||||
ptr_cast.rparen_token = try appendToken(c, .RParen, ")");
|
||||
if_1.body = &ptr_cast.base;
|
||||
|
||||
const else_1 = try transCreateNodeElse(c);
|
||||
@ -4410,8 +4420,8 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
|
||||
const type_of_2 = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
|
||||
try type_id_2.params.push(&type_of_2.base);
|
||||
try type_of_2.params.push(node_to_cast);
|
||||
type_of_2.rparen_token = try appendToken(c, .LParen, ")");
|
||||
type_id_2.rparen_token = try appendToken(c, .LParen, ")");
|
||||
type_of_2.rparen_token = try appendToken(c, .RParen, ")");
|
||||
type_id_2.rparen_token = try appendToken(c, .RParen, ")");
|
||||
|
||||
const cmp_2 = try c.a().create(ast.Node.InfixOp);
|
||||
cmp_2.* = .{
|
||||
@ -4422,12 +4432,12 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
|
||||
};
|
||||
if_2.condition = &cmp_2.base;
|
||||
else_1.body = &if_2.base;
|
||||
_ = try appendToken(c, .LParen, ")");
|
||||
_ = try appendToken(c, .RParen, ")");
|
||||
|
||||
const int_to_ptr = try transCreateNodeBuiltinFnCall(c, "@intToPtr");
|
||||
try int_to_ptr.params.push(inner_node);
|
||||
try int_to_ptr.params.push(node_to_cast);
|
||||
int_to_ptr.rparen_token = try appendToken(c, .LParen, ")");
|
||||
int_to_ptr.rparen_token = try appendToken(c, .RParen, ")");
|
||||
if_2.body = &int_to_ptr.base;
|
||||
|
||||
const else_2 = try transCreateNodeElse(c);
|
||||
@ -4436,7 +4446,7 @@ fn parseCPrimaryExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigC
|
||||
const as = try transCreateNodeBuiltinFnCall(c, "@as");
|
||||
try as.params.push(inner_node);
|
||||
try as.params.push(node_to_cast);
|
||||
as.rparen_token = try appendToken(c, .LParen, ")");
|
||||
as.rparen_token = try appendToken(c, .RParen, ")");
|
||||
else_2.body = &as.base;
|
||||
|
||||
return &if_1.base;
|
||||
@ -4638,7 +4648,11 @@ fn parseCPrefixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
|
||||
|
||||
fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 {
|
||||
const tok = c.tree.tokens.at(token);
|
||||
return c.source_buffer.toSlice()[tok.start..tok.end];
|
||||
const slice = c.source_buffer.toSlice()[tok.start..tok.end];
|
||||
return if (mem.startsWith(u8, slice, "@\""))
|
||||
slice[2 .. slice.len - 1]
|
||||
else
|
||||
slice;
|
||||
}
|
||||
|
||||
fn getContainer(c: *Context, node: *ast.Node) ?*ast.Node {
|
||||
|
@ -1098,13 +1098,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
});
|
||||
|
||||
cases.add("comma operator",
|
||||
\\int foo(char c) {
|
||||
\\int foo() {
|
||||
\\ 2, 4;
|
||||
\\ return 2, 4, 6;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo(_arg_c: u8) c_int {
|
||||
\\ var c = _arg_c;
|
||||
\\pub export fn foo() c_int {
|
||||
\\ _ = 2;
|
||||
\\ _ = 4;
|
||||
\\ _ = 2;
|
||||
@ -1113,15 +1112,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\}
|
||||
});
|
||||
|
||||
cases.add("wors-case assign",
|
||||
\\int foo(char c) {
|
||||
cases.add("worst-case assign",
|
||||
\\int foo() {
|
||||
\\ int a;
|
||||
\\ int b;
|
||||
\\ a = b = 2;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo(_arg_c: u8) c_int {
|
||||
\\ var c = _arg_c;
|
||||
\\pub export fn foo() c_int {
|
||||
\\ var a: c_int = undefined;
|
||||
\\ var b: c_int = undefined;
|
||||
\\ a = blk: {
|
||||
@ -1133,7 +1131,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
});
|
||||
|
||||
cases.add("if statements",
|
||||
\\int foo(char c) {
|
||||
\\int foo() {
|
||||
\\ if (2) {
|
||||
\\ int a = 2;
|
||||
\\ }
|
||||
@ -1142,8 +1140,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ }
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo(_arg_c: u8) c_int {
|
||||
\\ var c = _arg_c;
|
||||
\\pub export fn foo() c_int {
|
||||
\\ if (2 != 0) {
|
||||
\\ var a: c_int = 2;
|
||||
\\ }
|
||||
@ -1266,15 +1263,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ }
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn switch_fn(_arg_i: c_int) c_int {
|
||||
\\ var i = _arg_i;
|
||||
\\pub export fn switch_fn(_arg_i_1: c_int) c_int {
|
||||
\\ var i_1 = _arg_i_1;
|
||||
\\ var res: c_int = 0;
|
||||
\\ __switch: {
|
||||
\\ __case_2: {
|
||||
\\ __default: {
|
||||
\\ __case_1: {
|
||||
\\ __case_0: {
|
||||
\\ switch (i) {
|
||||
\\ switch (i_1) {
|
||||
\\ 0 => break :__case_0,
|
||||
\\ 1...3 => break :__case_1,
|
||||
\\ else => break :__default,
|
||||
@ -1285,7 +1282,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ }
|
||||
\\ res = 2;
|
||||
\\ }
|
||||
\\ res = (3 * i);
|
||||
\\ res = (3 * i_1);
|
||||
\\ break :__switch;
|
||||
\\ }
|
||||
\\ res = 5;
|
||||
@ -1328,11 +1325,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ a = tmp;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn max(_arg_a: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\pub export fn max(_arg_a_1: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var tmp: c_int = undefined;
|
||||
\\ tmp = a;
|
||||
\\ a = tmp;
|
||||
\\ tmp = a_1;
|
||||
\\ a_1 = tmp;
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1342,14 +1339,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ c = b = a;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn max(_arg_a: c_int) void {
|
||||
\\ var a = _arg_a;
|
||||
\\pub export fn max(_arg_a_1: c_int) void {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b: c_int = undefined;
|
||||
\\ var c: c_int = undefined;
|
||||
\\ c = blk: {
|
||||
\\ const _tmp_1 = a;
|
||||
\\ b = _tmp_1;
|
||||
\\ break :blk _tmp_1;
|
||||
\\ const _tmp_2 = a_1;
|
||||
\\ b = _tmp_2;
|
||||
\\ break :blk _tmp_2;
|
||||
\\ };
|
||||
\\}
|
||||
});
|
||||
@ -1373,9 +1370,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return (int)a;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn float_to_int(_arg_a: f32) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ return @floatToInt(c_int, a);
|
||||
\\pub export fn float_to_int(_arg_a_1: f32) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ return @floatToInt(c_int, a_1);
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1469,23 +1466,23 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ C,
|
||||
\\};
|
||||
\\pub const SomeTypedef = c_int;
|
||||
\\pub export fn and_or_non_bool(_arg_a: c_int, _arg_b: f32, _arg_c: ?*c_void) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ var c = _arg_c;
|
||||
\\pub export fn and_or_non_bool(_arg_a_1: c_int, _arg_b_2: f32, _arg_c_3: ?*c_void) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ var c_3 = _arg_c_3;
|
||||
\\ var d: enum_Foo = @intToEnum(enum_Foo, FooA);
|
||||
\\ var e: c_int = @boolToInt(((a != 0) and (b != 0)));
|
||||
\\ var f: c_int = @boolToInt(((b != 0) and (c != null)));
|
||||
\\ var g: c_int = @boolToInt(((a != 0) and (c != null)));
|
||||
\\ var h: c_int = @boolToInt(((a != 0) or (b != 0)));
|
||||
\\ var i: c_int = @boolToInt(((b != 0) or (c != null)));
|
||||
\\ var j: c_int = @boolToInt(((a != 0) or (c != null)));
|
||||
\\ var k: c_int = @boolToInt(((a != 0) or (@enumToInt(d) != 0)));
|
||||
\\ var l: c_int = @boolToInt(((@enumToInt(d) != 0) and (b != 0)));
|
||||
\\ var m: c_int = @boolToInt(((c != null) or (@enumToInt(d) != 0)));
|
||||
\\ var e: c_int = @boolToInt(((a_1 != 0) and (b_2 != 0)));
|
||||
\\ var f: c_int = @boolToInt(((b_2 != 0) and (c_3 != null)));
|
||||
\\ var g: c_int = @boolToInt(((a_1 != 0) and (c_3 != null)));
|
||||
\\ var h: c_int = @boolToInt(((a_1 != 0) or (b_2 != 0)));
|
||||
\\ var i: c_int = @boolToInt(((b_2 != 0) or (c_3 != null)));
|
||||
\\ var j: c_int = @boolToInt(((a_1 != 0) or (c_3 != null)));
|
||||
\\ var k: c_int = @boolToInt(((a_1 != 0) or (@enumToInt(d) != 0)));
|
||||
\\ var l: c_int = @boolToInt(((@enumToInt(d) != 0) and (b_2 != 0)));
|
||||
\\ var m: c_int = @boolToInt(((c_3 != null) or (@enumToInt(d) != 0)));
|
||||
\\ var td: SomeTypedef = 44;
|
||||
\\ var o: c_int = @boolToInt(((td != 0) or (b != 0)));
|
||||
\\ var p: c_int = @boolToInt(((c != null) and (td != 0)));
|
||||
\\ var o: c_int = @boolToInt(((td != 0) or (b_2 != 0)));
|
||||
\\ var p: c_int = @boolToInt(((c_3 != null) and (td != 0)));
|
||||
\\ return ((((((((((e + f) + g) + h) + i) + j) + k) + l) + m) + o) + p);
|
||||
\\}
|
||||
,
|
||||
@ -1523,10 +1520,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return (a & b) ^ (a | b);
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ return ((a & b) ^ (a | b));
|
||||
\\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ return ((a_1 & b_2) ^ (a_1 | b_2));
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1542,13 +1539,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return i;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn test_comparisons(_arg_a: c_int, _arg_b: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ var c: c_int = @boolToInt((a < b));
|
||||
\\ var d: c_int = @boolToInt((a > b));
|
||||
\\ var e: c_int = @boolToInt((a <= b));
|
||||
\\ var f: c_int = @boolToInt((a >= b));
|
||||
\\pub export fn test_comparisons(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ var c: c_int = @boolToInt((a_1 < b_2));
|
||||
\\ var d: c_int = @boolToInt((a_1 > b_2));
|
||||
\\ var e: c_int = @boolToInt((a_1 <= b_2));
|
||||
\\ var f: c_int = @boolToInt((a_1 >= b_2));
|
||||
\\ var g: c_int = @boolToInt((c < d));
|
||||
\\ var h: c_int = @boolToInt((e < f));
|
||||
\\ var i: c_int = @boolToInt((g < h));
|
||||
@ -1565,12 +1562,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return a;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ if (a == b) return a;
|
||||
\\ if (a != b) return b;
|
||||
\\ return a;
|
||||
\\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ if (a_1 == b_2) return a_1;
|
||||
\\ if (a_1 != b_2) return b_2;
|
||||
\\ return a_1;
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1643,9 +1640,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export var array: [100]c_int = .{0} ** 100;
|
||||
\\pub export fn foo(_arg_index: c_int) c_int {
|
||||
\\ var index = _arg_index;
|
||||
\\ return array[index];
|
||||
\\pub export fn foo(_arg_index_1: c_int) c_int {
|
||||
\\ var index_1 = _arg_index_1;
|
||||
\\ return array[index_1];
|
||||
\\}
|
||||
,
|
||||
\\pub const ACCESS = array[2];
|
||||
@ -1668,12 +1665,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return a;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ if ((a < b) or (a == b)) return b;
|
||||
\\ if ((a >= b) and (a == b)) return a;
|
||||
\\ return a;
|
||||
\\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ if ((a_1 < b_2) or (a_1 == b_2)) return b_2;
|
||||
\\ if ((a_1 >= b_2) and (a_1 == b_2)) return a_1;
|
||||
\\ return a_1;
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1690,12 +1687,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ if (a < b) ; else ;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn max(_arg_a: c_int, _arg_b: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ if (a < b) return b;
|
||||
\\ if (a < b) return b else return a;
|
||||
\\ if (a < b) {} else {}
|
||||
\\pub export fn max(_arg_a_1: c_int, _arg_b_2: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ if (a_1 < b_2) return b_2;
|
||||
\\ if (a_1 < b_2) return b_2 else return a_1;
|
||||
\\ if (a_1 < b_2) {} else {}
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1714,15 +1711,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ B,
|
||||
\\ C,
|
||||
\\};
|
||||
\\pub export fn if_none_bool(_arg_a: c_int, _arg_b: f32, _arg_c: ?*c_void, _arg_d: enum_SomeEnum) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ var b = _arg_b;
|
||||
\\ var c = _arg_c;
|
||||
\\ var d = _arg_d;
|
||||
\\ if (a != 0) return 0;
|
||||
\\ if (b != 0) return 1;
|
||||
\\ if (c != null) return 2;
|
||||
\\ if (d != 0) return 3;
|
||||
\\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 {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var b_2 = _arg_b_2;
|
||||
\\ var c_3 = _arg_c_3;
|
||||
\\ var d_4 = _arg_d_4;
|
||||
\\ if (a_1 != 0) return 0;
|
||||
\\ if (b_2 != 0) return 1;
|
||||
\\ if (c_3 != null) return 2;
|
||||
\\ if (d_4 != 0) return 3;
|
||||
\\ return 4;
|
||||
\\}
|
||||
});
|
||||
@ -1744,9 +1741,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return a < 0 ? -a : a;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn abs(_arg_a: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ return if (a < 0) -a else a;
|
||||
\\pub export fn abs(_arg_a_1: c_int) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ return if (a_1 < 0) -a_1 else a_1;
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1760,15 +1757,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return a;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo1(_arg_a: c_uint) c_uint {
|
||||
\\ var a = _arg_a;
|
||||
\\ a +%= 1;
|
||||
\\ return a;
|
||||
\\pub export fn foo1(_arg_a_1: c_uint) c_uint {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ a_1 +%= 1;
|
||||
\\ return a_1;
|
||||
\\}
|
||||
\\pub export fn foo2(_arg_a: c_int) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\ a += 1;
|
||||
\\ return a;
|
||||
\\pub export fn foo2(_arg_a_2: c_int) c_int {
|
||||
\\ var a_2 = _arg_a_2;
|
||||
\\ a_2 += 1;
|
||||
\\ return a_2;
|
||||
\\}
|
||||
});
|
||||
|
||||
@ -1855,11 +1852,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return i;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn log2(_arg_a: c_uint) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\pub export fn log2(_arg_a_1: c_uint) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var i: c_int = 0;
|
||||
\\ while (a > @intCast(c_uint, 0)) {
|
||||
\\ a >>= @as(@import("std").math.Log2Int(c_int), 1);
|
||||
\\ while (a_1 > @intCast(c_uint, 0)) {
|
||||
\\ a_1 >>= @as(@import("std").math.Log2Int(c_int), 1);
|
||||
\\ }
|
||||
\\ return i;
|
||||
\\}
|
||||
@ -1875,11 +1872,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\ return i;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn log2(_arg_a: u32) c_int {
|
||||
\\ var a = _arg_a;
|
||||
\\pub export fn log2(_arg_a_1: u32) c_int {
|
||||
\\ var a_1 = _arg_a_1;
|
||||
\\ var i: c_int = 0;
|
||||
\\ while (a > @intCast(c_uint, 0)) {
|
||||
\\ a >>= @as(@import("std").math.Log2Int(c_int), 1);
|
||||
\\ while (a_1 > @intCast(c_uint, 0)) {
|
||||
\\ a_1 >>= @as(@import("std").math.Log2Int(c_int), 1);
|
||||
\\ }
|
||||
\\ return i;
|
||||
\\}
|
||||
@ -2059,7 +2056,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\void fn_bool(bool x);
|
||||
\\void fn_ptr(void *x);
|
||||
\\
|
||||
\\void call(int q) {
|
||||
\\void call() {
|
||||
\\ fn_int(3.0f);
|
||||
\\ fn_int(3.0);
|
||||
\\ fn_int(3.0L);
|
||||
@ -2084,8 +2081,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\pub extern fn fn_char(x: u8) void;
|
||||
\\pub extern fn fn_bool(x: bool) void;
|
||||
\\pub extern fn fn_ptr(x: ?*c_void) void;
|
||||
\\pub export fn call(_arg_q: c_int) void {
|
||||
\\ var q = _arg_q;
|
||||
\\pub export fn call() void {
|
||||
\\ fn_int(@floatToInt(c_int, 3));
|
||||
\\ fn_int(@floatToInt(c_int, 3));
|
||||
\\ fn_int(@floatToInt(c_int, 3));
|
||||
@ -2113,10 +2109,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub fn bar() void {}
|
||||
\\pub export fn foo(_arg_baz: ?extern fn () [*c]c_int) void {
|
||||
\\ var baz = _arg_baz;
|
||||
\\pub export fn foo(_arg_baz_1: ?extern fn () [*c]c_int) void {
|
||||
\\ var baz_1 = _arg_baz_1;
|
||||
\\ bar();
|
||||
\\ _ = baz.?();
|
||||
\\ _ = baz_1.?();
|
||||
\\}
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user