Skip to content

Commit f5e7d2d

Browse files
committed
translate-c fix bugs
Thanks @daurnimator
1 parent 59cc707 commit f5e7d2d

File tree

3 files changed

+151
-141
lines changed

3 files changed

+151
-141
lines changed

lib/std/zig/render.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

581591
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
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

46394649
fn 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

46444658
fn getContainer(c: *Context, node: *ast.Node) ?*ast.Node {

0 commit comments

Comments
 (0)