diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index 5b7605c021687eb5ddd6e593f65d08244d2c3168..eea6d757dc46889ea131fc1db14aafdca0e0db70 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -938,6 +938,7 @@ pub extern fn ZigClangImplicitCastExpr_getCastKind(*const ZigClangImplicitCastEx pub extern fn ZigClangImplicitCastExpr_getSubExpr(*const ZigClangImplicitCastExpr) *const ZigClangExpr; pub extern fn ZigClangArrayType_getElementType(*const ZigClangArrayType) ZigClangQualType; +pub extern fn ZigClangIncompleteArrayType_getElementType(*const ZigClangIncompleteArrayType) ZigClangQualType; pub extern fn ZigClangConstantArrayType_getElementType(self: *const struct_ZigClangConstantArrayType) ZigClangQualType; pub extern fn ZigClangConstantArrayType_getSize(self: *const struct_ZigClangConstantArrayType) *const struct_ZigClangAPInt; @@ -968,6 +969,7 @@ pub const struct_ZigClangAPValue = extern struct { Kind: ZigClangAPValueKind, Data: if (builtin.os == .windows and builtin.abi == .msvc) [52]u8 else [68]u8, }; +pub extern fn ZigClangVarDecl_getTypeSourceInfo_getType(self: *const struct_ZigClangVarDecl) struct_ZigClangQualType; pub extern fn ZigClangIntegerLiteral_EvaluateAsInt(*const ZigClangIntegerLiteral, *ZigClangExprEvalResult, *const ZigClangASTContext) bool; pub extern fn ZigClangIntegerLiteral_getBeginLoc(*const ZigClangIntegerLiteral) ZigClangSourceLocation; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index db3e1c5e411ee357c5bbdbf8354246209445882d..80d0e21989a88d87bb71bf86c39a2aea8804a864 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -609,7 +609,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe null else try appendToken(c, .Keyword_threadlocal, "threadlocal"); - const qual_type = ZigClangVarDecl_getType(var_decl); + const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); const mut_token = if (ZigClangQualType_isConstQualified(qual_type)) try appendToken(c, .Keyword_const, "const") else @@ -1454,6 +1454,19 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour node.rhs = try transQualType(rp, ZigClangConstantArrayType_getElementType(const_arr_ty), source_loc); return &node.base; }, + .IncompleteArray => { + const incomplete_array_ty = @ptrCast(*const ZigClangIncompleteArrayType, ty); + + const child_qt = ZigClangIncompleteArrayType_getElementType(incomplete_array_ty); + var node = try transCreateNodePtrType( + rp.c, + ZigClangQualType_isConstQualified(child_qt), + ZigClangQualType_isVolatileQualified(child_qt), + .Identifier, + ); + node.rhs = try transQualType(rp, child_qt, source_loc); + return &node.base; + }, else => { const type_name = rp.c.str(ZigClangType_getTypeClassName(ty)); return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported type: '{}'", .{type_name}); diff --git a/test/translate_c.zig b/test/translate_c.zig index 5772763a653c047825f64bcd5db380e2efd8855c..3b067d1beac1487066e51c8b92ab1429d38e6b84 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -1,11 +1,11 @@ const tests = @import("tests.zig"); const builtin = @import("builtin"); -// add_both - test for stage1 and stage2, in #include mode -// add - test stage1 only, in #include mode -// add_2 - test stage2 only, in #include mode +// add_both - test for stage1 and stage2 +// add - test stage1 only +// add_2 - test stage2 only -pub export fn addCases(cases: *tests.TranslateCContext) void { +pub fn addCases(cases: *tests.TranslateCContext) void { /////////////// Cases that pass for both stage1/stage2 //////////////// cases.add_both("simple function prototypes", \\void __attribute__((noreturn)) foo(void); @@ -66,6 +66,24 @@ pub export fn addCases(cases: *tests.TranslateCContext) void { \\pub var v0: [*c]const u8 = "0.0.0"; }); + cases.add_both("static incomplete array inside function", + \\void foo(void) { + \\ static const char v2[] = "2.2.2"; + \\} + , &[_][]const u8{ + \\pub export fn foo() void { + \\ const v2: [*c]const u8 = "2.2.2"; + \\} + }); + + cases.add_both("simple function definition", + \\void foo(void) {} + \\static void bar(void) {} + , &[_][]const u8{ + \\pub export fn foo() void {} + \\pub fn bar() void {} + }); + /////////////// Cases that pass for only stage2 //////////////// cases.add_2("Parameterless function prototypes", @@ -80,26 +98,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void { \\pub extern fn d() void; }); - cases.add_2("simple function definition", - \\void foo(void) {} - \\static void bar(void) {} - , &[_][]const u8{ - \\pub export fn foo() void {} - \\pub fn bar() void {} - }); - - cases.add_2("parameterless function prototypes", - \\void a() {} - \\void b(void) {} - \\void c(); - \\void d(void); - , &[_][]const u8{ - \\pub export fn a() void {} - \\pub export fn b() void {} - \\pub extern fn c(...) void; - \\pub extern fn d() void; - }); - /////////////// Cases for only stage1 which are TODO items for stage2 //////////////// cases.add("typedef of function in struct field", @@ -130,14 +128,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void { \\}; }); - cases.add_both("simple function definition", - \\void foo(void) {} - \\static void bar(void) {} - , &[_][]const u8{ - \\pub export fn foo() void {} - \\pub fn bar() void {} - }); - cases.add("macro with left shift", \\#define REDISMODULE_READ (1<<0) , &[_][]const u8{ @@ -1521,16 +1511,6 @@ pub export fn addCases(cases: *tests.TranslateCContext) void { \\} }); - cases.add("static incomplete array inside function", - \\void foo(void) { - \\ static const char v2[] = "2.2.2"; - \\} - , &[_][]const u8{ - \\pub export fn foo() void { - \\ const v2: [*c]const u8 = "2.2.2"; - \\} - }); - cases.add("macro pointer cast", \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE) , &[_][]const u8{