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...@@ -938,6 +938,7 @@ pub extern fn ZigClangImplicitCastExpr_getCastKind(*const ZigClangImplicitCastEx
938pub extern fn ZigClangImplicitCastExpr_getSubExpr(*const ZigClangImplicitCastExpr) *const ZigClangExpr;938pub extern fn ZigClangImplicitCastExpr_getSubExpr(*const ZigClangImplicitCastExpr) *const ZigClangExpr;
939939
940pub extern fn ZigClangArrayType_getElementType(*const ZigClangArrayType) ZigClangQualType;940pub extern fn ZigClangArrayType_getElementType(*const ZigClangArrayType) ZigClangQualType;
941pub extern fn ZigClangIncompleteArrayType_getElementType(*const ZigClangIncompleteArrayType) ZigClangQualType;
941942
942pub extern fn ZigClangConstantArrayType_getElementType(self: *const struct_ZigClangConstantArrayType) ZigClangQualType;943pub extern fn ZigClangConstantArrayType_getElementType(self: *const struct_ZigClangConstantArrayType) ZigClangQualType;
943pub extern fn ZigClangConstantArrayType_getSize(self: *const struct_ZigClangConstantArrayType) *const struct_ZigClangAPInt;944pub extern fn ZigClangConstantArrayType_getSize(self: *const struct_ZigClangConstantArrayType) *const struct_ZigClangAPInt;
...@@ -968,6 +969,7 @@ pub const struct_ZigClangAPValue = extern struct {...@@ -968,6 +969,7 @@ pub const struct_ZigClangAPValue = extern struct {
968 Kind: ZigClangAPValueKind,969 Kind: ZigClangAPValueKind,
969 Data: if (builtin.os == .windows and builtin.abi == .msvc) [52]u8 else [68]u8,970 Data: if (builtin.os == .windows and builtin.abi == .msvc) [52]u8 else [68]u8,
970};971};
972pub extern fn ZigClangVarDecl_getTypeSourceInfo_getType(self: *const struct_ZigClangVarDecl) struct_ZigClangQualType;
971973
972pub extern fn ZigClangIntegerLiteral_EvaluateAsInt(*const ZigClangIntegerLiteral, *ZigClangExprEvalResult, *const ZigClangASTContext) bool;974pub extern fn ZigClangIntegerLiteral_EvaluateAsInt(*const ZigClangIntegerLiteral, *ZigClangExprEvalResult, *const ZigClangASTContext) bool;
973pub extern fn ZigClangIntegerLiteral_getBeginLoc(*const ZigClangIntegerLiteral) ZigClangSourceLocation;975pub 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...@@ -609,7 +609,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
609 null609 null
610 else610 else
611 try appendToken(c, .Keyword_threadlocal, "threadlocal");611 try appendToken(c, .Keyword_threadlocal, "threadlocal");
612 const qual_type = ZigClangVarDecl_getType(var_decl);612 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
613 const mut_token = if (ZigClangQualType_isConstQualified(qual_type))613 const mut_token = if (ZigClangQualType_isConstQualified(qual_type))
614 try appendToken(c, .Keyword_const, "const")614 try appendToken(c, .Keyword_const, "const")
615 else615 else
...@@ -1454,6 +1454,19 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -1454,6 +1454,19 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
1454 node.rhs = try transQualType(rp, ZigClangConstantArrayType_getElementType(const_arr_ty), source_loc);1454 node.rhs = try transQualType(rp, ZigClangConstantArrayType_getElementType(const_arr_ty), source_loc);
1455 return &node.base;1455 return &node.base;
1456 },1456 },
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 },
1457 else => {1470 else => {
1458 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));1471 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));
1459 return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported type: '{}'", .{type_name});1472 return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported type: '{}'", .{type_name});
test/translate_c.zig+15-35
...@@ -1,11 +1,11 @@...@@ -1,11 +1,11 @@
1const tests = @import("tests.zig");1const tests = @import("tests.zig");
2const builtin = @import("builtin");2const builtin = @import("builtin");
33
4// add_both - test for stage1 and stage2, in #include mode4// add_both - test for stage1 and stage2
5// add - test stage1 only, in #include mode5// add - test stage1 only
6// add_2 - test stage2 only, in #include mode6// add_2 - test stage2 only
77
8pub export fn addCases(cases: *tests.TranslateCContext) void {8pub fn addCases(cases: *tests.TranslateCContext) void {
9 /////////////// Cases that pass for both stage1/stage2 ////////////////9 /////////////// Cases that pass for both stage1/stage2 ////////////////
10 cases.add_both("simple function prototypes",10 cases.add_both("simple function prototypes",
11 \\void __attribute__((noreturn)) foo(void);11 \\void __attribute__((noreturn)) foo(void);
...@@ -66,21 +66,17 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {...@@ -66,21 +66,17 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
66 \\pub var v0: [*c]const u8 = "0.0.0";66 \\pub var v0: [*c]const u8 = "0.0.0";
67 });67 });
6868
69 /////////////// Cases that pass for only stage2 ////////////////69 cases.add_both("static incomplete array inside function",
7070 \\void foo(void) {
71 cases.add_2("Parameterless function prototypes",71 \\ static const char v2[] = "2.2.2";
72 \\void a() {}72 \\}
73 \\void b(void) {}
74 \\void c();
75 \\void d(void);
76 , &[_][]const u8{73 , &[_][]const u8{
77 \\pub export fn a() void {}74 \\pub export fn foo() void {
78 \\pub export fn b() void {}75 \\ const v2: [*c]const u8 = "2.2.2";
79 \\pub extern fn c(...) void;76 \\}
80 \\pub extern fn d() void;
81 });77 });
8278
83 cases.add_2("simple function definition",79 cases.add_both("simple function definition",
84 \\void foo(void) {}80 \\void foo(void) {}
85 \\static void bar(void) {}81 \\static void bar(void) {}
86 , &[_][]const u8{82 , &[_][]const u8{
...@@ -88,7 +84,9 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {...@@ -88,7 +84,9 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
88 \\pub fn bar() void {}84 \\pub fn bar() void {}
89 });85 });
9086
91 cases.add_2("parameterless function prototypes",87 /////////////// Cases that pass for only stage2 ////////////////
88
89 cases.add_2("Parameterless function prototypes",
92 \\void a() {}90 \\void a() {}
93 \\void b(void) {}91 \\void b(void) {}
94 \\void c();92 \\void c();
...@@ -130,14 +128,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {...@@ -130,14 +128,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
130 \\};128 \\};
131 });129 });
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
141 cases.add("macro with left shift",131 cases.add("macro with left shift",
142 \\#define REDISMODULE_READ (1<<0)132 \\#define REDISMODULE_READ (1<<0)
143 , &[_][]const u8{133 , &[_][]const u8{
...@@ -1521,16 +1511,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {...@@ -1521,16 +1511,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
1521 \\}1511 \\}
1522 });1512 });
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
1534 cases.add("macro pointer cast",1514 cases.add("macro pointer cast",
1535 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)1515 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)
1536 , &[_][]const u8{1516 , &[_][]const u8{