Commit 0795f17db2
Changed files (3)
src-self-hosted
test
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;
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});
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,21 +66,17 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
\\pub var v0: [*c]const u8 = "0.0.0";
});
- /////////////// Cases that pass for only stage2 ////////////////
-
- cases.add_2("Parameterless function prototypes",
- \\void a() {}
- \\void b(void) {}
- \\void c();
- \\void d(void);
+ cases.add_both("static incomplete array inside function",
+ \\void foo(void) {
+ \\ static const char v2[] = "2.2.2";
+ \\}
, &[_][]const u8{
- \\pub export fn a() void {}
- \\pub export fn b() void {}
- \\pub extern fn c(...) void;
- \\pub extern fn d() void;
+ \\pub export fn foo() void {
+ \\ const v2: [*c]const u8 = "2.2.2";
+ \\}
});
- cases.add_2("simple function definition",
+ cases.add_both("simple function definition",
\\void foo(void) {}
\\static void bar(void) {}
, &[_][]const u8{
@@ -88,7 +84,9 @@ pub export fn addCases(cases: *tests.TranslateCContext) void {
\\pub fn bar() void {}
});
- cases.add_2("parameterless function prototypes",
+ /////////////// Cases that pass for only stage2 ////////////////
+
+ cases.add_2("Parameterless function prototypes",
\\void a() {}
\\void b(void) {}
\\void c();
@@ -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{