authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-20 23:13:20+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-22 17:58:57-05:00
loga284be3f69aabb13ad64753e03601169e8292a24
tree32e41dc8d128711b059045018cde1e1716b2c0de
parentb94525c45b695b116c2af69174283ad10dce6de9

Fix unsafe cast in translate_c

Fixes #4250

5 files changed, 34 insertions(+), 1 deletions(-)

src-self-hosted/clang.zig+1
...@@ -809,6 +809,7 @@ pub extern fn ZigClangQualType_isRestrictQualified(self: struct_ZigClangQualType...@@ -809,6 +809,7 @@ pub extern fn ZigClangQualType_isRestrictQualified(self: struct_ZigClangQualType
809pub extern fn ZigClangType_getTypeClass(self: ?*const struct_ZigClangType) ZigClangTypeClass;809pub extern fn ZigClangType_getTypeClass(self: ?*const struct_ZigClangType) ZigClangTypeClass;
810pub extern fn ZigClangType_getPointeeType(self: ?*const struct_ZigClangType) struct_ZigClangQualType;810pub extern fn ZigClangType_getPointeeType(self: ?*const struct_ZigClangType) struct_ZigClangQualType;
811pub extern fn ZigClangType_isVoidType(self: ?*const struct_ZigClangType) bool;811pub extern fn ZigClangType_isVoidType(self: ?*const struct_ZigClangType) bool;
812pub extern fn ZigClangType_isConstantArrayType(self: ?*const struct_ZigClangType) bool;
812pub extern fn ZigClangType_isRecordType(self: ?*const struct_ZigClangType) bool;813pub extern fn ZigClangType_isRecordType(self: ?*const struct_ZigClangType) bool;
813pub extern fn ZigClangType_isArrayType(self: ?*const struct_ZigClangType) bool;814pub extern fn ZigClangType_isArrayType(self: ?*const struct_ZigClangType) bool;
814pub extern fn ZigClangType_isBooleanType(self: ?*const struct_ZigClangType) bool;815pub extern fn ZigClangType_isBooleanType(self: ?*const struct_ZigClangType) bool;
src-self-hosted/translate_c.zig+2-1
...@@ -1982,7 +1982,8 @@ fn transInitListExprArray(...@@ -1982,7 +1982,8 @@ fn transInitListExprArray(
1982 const arr_type = ZigClangType_getAsArrayTypeUnsafe(ty);1982 const arr_type = ZigClangType_getAsArrayTypeUnsafe(ty);
1983 const child_qt = ZigClangArrayType_getElementType(arr_type);1983 const child_qt = ZigClangArrayType_getElementType(arr_type);
1984 const init_count = ZigClangInitListExpr_getNumInits(expr);1984 const init_count = ZigClangInitListExpr_getNumInits(expr);
1985 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, ty);1985 assert(ZigClangType_isConstantArrayType(@ptrCast(*const ZigClangType, arr_type)));
1986 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, arr_type);
1986 const size_ap_int = ZigClangConstantArrayType_getSize(const_arr_ty);1987 const size_ap_int = ZigClangConstantArrayType_getSize(const_arr_ty);
1987 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, math.maxInt(usize));1988 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, math.maxInt(usize));
1988 const leftover_count = all_count - init_count;1989 const leftover_count = all_count - init_count;
src/zig_clang.cpp+5
...@@ -1877,6 +1877,11 @@ bool ZigClangType_isRecordType(const ZigClangType *self) {...@@ -1877,6 +1877,11 @@ bool ZigClangType_isRecordType(const ZigClangType *self) {
1877 return casted->isRecordType();1877 return casted->isRecordType();
1878}1878}
18791879
1880bool ZigClangType_isConstantArrayType(const ZigClangType *self) {
1881 auto casted = reinterpret_cast<const clang::Type *>(self);
1882 return casted->isConstantArrayType();
1883}
1884
1880const char *ZigClangType_getTypeClassName(const ZigClangType *self) {1885const char *ZigClangType_getTypeClassName(const ZigClangType *self) {
1881 auto casted = reinterpret_cast<const clang::Type *>(self);1886 auto casted = reinterpret_cast<const clang::Type *>(self);
1882 return casted->getTypeClassName();1887 return casted->getTypeClassName();
src/zig_clang.h+1
...@@ -945,6 +945,7 @@ ZIG_EXTERN_C bool ZigClangType_isBooleanType(const struct ZigClangType *self);...@@ -945,6 +945,7 @@ ZIG_EXTERN_C bool ZigClangType_isBooleanType(const struct ZigClangType *self);
945ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self);945ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self);
946ZIG_EXTERN_C bool ZigClangType_isArrayType(const struct ZigClangType *self);946ZIG_EXTERN_C bool ZigClangType_isArrayType(const struct ZigClangType *self);
947ZIG_EXTERN_C bool ZigClangType_isRecordType(const struct ZigClangType *self);947ZIG_EXTERN_C bool ZigClangType_isRecordType(const struct ZigClangType *self);
948ZIG_EXTERN_C bool ZigClangType_isConstantArrayType(const ZigClangType *self);
948ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self);949ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self);
949ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self);950ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self);
950ZIG_EXTERN_C const ZigClangRecordType *ZigClangType_getAsRecordType(const ZigClangType *self);951ZIG_EXTERN_C const ZigClangRecordType *ZigClangType_getAsRecordType(const ZigClangType *self);
test/translate_c.zig+25
...@@ -2,6 +2,31 @@ const tests = @import("tests.zig");...@@ -2,6 +2,31 @@ const tests = @import("tests.zig");
2const builtin = @import("builtin");2const builtin = @import("builtin");
33
4pub fn addCases(cases: *tests.TranslateCContext) void {4pub fn addCases(cases: *tests.TranslateCContext) void {
5 cases.add("array initializer w/ typedef",
6 \\typedef unsigned char uuid_t[16];
7 \\static const uuid_t UUID_NULL __attribute__ ((unused)) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
8 , &[_][]const u8{
9 \\pub const uuid_t = [16]u8;
10 \\pub const UUID_NULL: uuid_t = .{
11 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
12 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
13 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
14 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
15 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
16 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
17 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
18 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
19 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
20 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
21 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
22 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
23 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
24 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
25 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
26 \\ @bitCast(u8, @truncate(i8, @as(c_int, 0))),
27 \\};
28 });
29
5 cases.add("empty declaration",30 cases.add("empty declaration",
6 \\;31 \\;
7 , &[_][]const u8{""});32 , &[_][]const u8{""});