authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-12 21:14:55+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-12 21:39:04+02:00
log0795f17db23fff5aada41008348a63cbc9e0321b
tree62341cccc8b3b5d6a8724f4e5f4e832fd948893b
parent48ac84db1b6638d4892a5b9d88d193562e1a4f04
signature Commit is signed but in an unrecognized format.

translate-c-2 incompleteArray


3 files changed, 31 insertions(+), 36 deletions(-)

src-self-hosted/clang.zig+2
......@@ -938,6 +938,7 @@ pub extern fn ZigClangImplicitCastExpr_getCastKind(*const ZigClangImplicitCastEx
938938pub extern fn ZigClangImplicitCastExpr_getSubExpr(*const ZigClangImplicitCastExpr) *const ZigClangExpr;
939939
940940pub extern fn ZigClangArrayType_getElementType(*const ZigClangArrayType) ZigClangQualType;
941pub extern fn ZigClangIncompleteArrayType_getElementType(*const ZigClangIncompleteArrayType) ZigClangQualType;
941942
942943pub extern fn ZigClangConstantArrayType_getElementType(self: *const struct_ZigClangConstantArrayType) ZigClangQualType;
943944pub extern fn ZigClangConstantArrayType_getSize(self: *const struct_ZigClangConstantArrayType) *const struct_ZigClangAPInt;
......@@ -968,6 +969,7 @@ pub const struct_ZigClangAPValue = extern struct {
968969 Kind: ZigClangAPValueKind,
969970 Data: if (builtin.os == .windows and builtin.abi == .msvc) [52]u8 else [68]u8,
970971};
972pub extern fn ZigClangVarDecl_getTypeSourceInfo_getType(self: *const struct_ZigClangVarDecl) struct_ZigClangQualType;
971973
972974pub extern fn ZigClangIntegerLiteral_EvaluateAsInt(*const ZigClangIntegerLiteral, *ZigClangExprEvalResult, *const ZigClangASTContext) bool;
973975pub extern fn ZigClangIntegerLiteral_getBeginLoc(*const ZigClangIntegerLiteral) ZigClangSourceLocation;
src-self-hosted/translate_c.zig+14-1
......@@ -609,7 +609,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
609609 null
610610 else
611611 try appendToken(c, .Keyword_threadlocal, "threadlocal");
612 const qual_type = ZigClangVarDecl_getType(var_decl);
612 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
613613 const mut_token = if (ZigClangQualType_isConstQualified(qual_type))
614614 try appendToken(c, .Keyword_const, "const")
615615 else
......@@ -1454,6 +1454,19 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
14541454 node.rhs = try transQualType(rp, ZigClangConstantArrayType_getElementType(const_arr_ty), source_loc);
14551455 return &node.base;
14561456 },
1457 .IncompleteArray => {
1458 const incomplete_array_ty = @ptrCast(*const ZigClangIncompleteArrayType, ty);
1459
1460 const child_qt = ZigClangIncompleteArrayType_getElementType(incomplete_array_ty);
1461 var node = try transCreateNodePtrType(
1462 rp.c,
1463 ZigClangQualType_isConstQualified(child_qt),
1464 ZigClangQualType_isVolatileQualified(child_qt),
1465 .Identifier,
1466 );
1467 node.rhs = try transQualType(rp, child_qt, source_loc);
1468 return &node.base;
1469 },
14571470 else => {
14581471 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));
14591472 return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported type: '{}'", .{type_name});
test/translate_c.zig+15-35
......@@ -1,11 +1,11 @@
11const tests = @import("tests.zig");
22const builtin = @import("builtin");
33
4// add_both - test for stage1 and stage2, in #include mode
5// add - test stage1 only, in #include mode
6// add_2 - test stage2 only, in #include mode
4// add_both - test for stage1 and stage2
5// add - test stage1 only
6// add_2 - test stage2 only
77
8pub export fn addCases(cases: *tests.TranslateCContext) void {
8pub fn addCases(cases: *tests.TranslateCContext) void {
99 /////////////// Cases that pass for both stage1/stage2 ////////////////
1010 cases.add_both("simple function prototypes",
1111 \\void __attribute__((noreturn)) foo(void);
......@@ -66,21 +66,17 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
6666 \\pub var v0: [*c]const u8 = "0.0.0";
6767 });
6868
69 /////////////// Cases that pass for only stage2 ////////////////
70
71 cases.add_2("Parameterless function prototypes",
72 \\void a() {}
73 \\void b(void) {}
74 \\void c();
75 \\void d(void);
69 cases.add_both("static incomplete array inside function",
70 \\void foo(void) {
71 \\ static const char v2[] = "2.2.2";
72 \\}
7673 , &[_][]const u8{
77 \\pub export fn a() void {}
78 \\pub export fn b() void {}
79 \\pub extern fn c(...) void;
80 \\pub extern fn d() void;
74 \\pub export fn foo() void {
75 \\ const v2: [*c]const u8 = "2.2.2";
76 \\}
8177 });
8278
83 cases.add_2("simple function definition",
79 cases.add_both("simple function definition",
8480 \\void foo(void) {}
8581 \\static void bar(void) {}
8682 , &[_][]const u8{
......@@ -88,7 +84,9 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
8884 \\pub fn bar() void {}
8985 });
9086
91 cases.add_2("parameterless function prototypes",
87 /////////////// Cases that pass for only stage2 ////////////////
88
89 cases.add_2("Parameterless function prototypes",
9290 \\void a() {}
9391 \\void b(void) {}
9492 \\void c();
......@@ -130,14 +128,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
130128 \\};
131129 });
132130
133 cases.add_both("simple function definition",
134 \\void foo(void) {}
135 \\static void bar(void) {}
136 , &[_][]const u8{
137 \\pub export fn foo() void {}
138 \\pub fn bar() void {}
139 });
140
141131 cases.add("macro with left shift",
142132 \\#define REDISMODULE_READ (1<<0)
143133 , &[_][]const u8{
......@@ -1521,16 +1511,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
15211511 \\}
15221512 });
15231513
1524 cases.add("static incomplete array inside function",
1525 \\void foo(void) {
1526 \\ static const char v2[] = "2.2.2";
1527 \\}
1528 , &[_][]const u8{
1529 \\pub export fn foo() void {
1530 \\ const v2: [*c]const u8 = "2.2.2";
1531 \\}
1532 });
1533
15341514 cases.add("macro pointer cast",
15351515 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)
15361516 , &[_][]const u8{