authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-12 12:11:26-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-12 12:11:26-04:00
log4e58855a4a45981337722be3ffe321bb84825992
treedce03699ed1c94b28239cc52b5574e51420c953e
parent52f0300505a3b0b9697c61cbf1356c40d8f0dd0a
signaturelock-open Commit is signed but in an unrecognized format.

translate-c: better detection of pointer to struct demoted to opaque


2 files changed, 30 insertions(+), 2 deletions(-)

src/translate_c.cpp+17-2
...@@ -840,8 +840,23 @@ static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLoc...@@ -840,8 +840,23 @@ static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLoc
840 return ZigClangBuiltinType_getKind(builtin_ty) == ZigClangBuiltinTypeVoid;840 return ZigClangBuiltinType_getKind(builtin_ty) == ZigClangBuiltinTypeVoid;
841 }841 }
842 case ZigClangType_Record: {842 case ZigClangType_Record: {
843 const clang::RecordType *record_ty = reinterpret_cast<const clang::RecordType*>(ty);843 const ZigClangRecordType *record_ty = reinterpret_cast<const ZigClangRecordType*>(ty);
844 return record_ty->getDecl()->getDefinition() == nullptr;844 const ZigClangRecordDecl *record_decl = ZigClangRecordType_getDecl(record_ty);
845 const ZigClangRecordDecl *record_def = ZigClangRecordDecl_getDefinition(record_decl);
846 if (record_def == nullptr) {
847 return true;
848 }
849 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
850 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
851 it != it_end; ++it)
852 {
853 const clang::FieldDecl *field_decl = *it;
854
855 if (field_decl->isBitField()) {
856 return true;
857 }
858 }
859 return false;
845 }860 }
846 case ZigClangType_Elaborated: {861 case ZigClangType_Elaborated: {
847 const clang::ElaboratedType *elaborated_ty = reinterpret_cast<const clang::ElaboratedType*>(ty);862 const clang::ElaboratedType *elaborated_ty = reinterpret_cast<const clang::ElaboratedType*>(ty);
test/translate_c.zig+13
...@@ -40,6 +40,19 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -40,6 +40,19 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
40 );40 );
4141
42 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////42 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
43 cases.add("pointer to struct demoted to opaque due to bit fields",
44 \\struct Foo {
45 \\ unsigned int: 1;
46 \\};
47 \\struct Bar {
48 \\ struct Foo *foo;
49 \\};
50 ,
51 \\pub const struct_Foo = @OpaqueType();
52 \\pub const struct_Bar = extern struct {
53 \\ foo: ?*struct_Foo,
54 \\};
55 );
4356
44 cases.add("macro with left shift",57 cases.add("macro with left shift",
45 \\#define REDISMODULE_READ (1<<0)58 \\#define REDISMODULE_READ (1<<0)