authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-07 00:18:24-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-07 00:18:24-07:00
logfc310965197511ade998b5e6439c92a40af244d1
treee6bf12beacdff796786128311f311f3a072456ba
parentf19fa590e550975fcd821338923785335c9f393a

parseh: fix not properly demoting structs to typedefs


1 files changed, 13 insertions(+), 7 deletions(-)

src/parseh.cpp+13-7
......@@ -838,6 +838,16 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) {
838838
839839}
840840
841static void replace_with_fwd_decl(Context *c, TypeTableEntry *struct_type, Buf *full_type_name) {
842 unsigned line = c->source_node ? c->source_node->line : 0;
843 LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugForwardDeclType(c->codegen->dbuilder,
844 LLVMZigTag_DW_structure_type(), buf_ptr(full_type_name),
845 LLVMZigFileToScope(c->import->di_file), c->import->di_file, line);
846
847 LLVMZigReplaceTemporary(c->codegen->dbuilder, struct_type->di_type, replacement_di_type);
848 struct_type->di_type = replacement_di_type;
849}
850
841851static TypeTableEntry *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
842852 const char *raw_name = decl_name(record_decl);
843853
......@@ -869,13 +879,7 @@ static TypeTableEntry *resolve_record_decl(Context *c, const RecordDecl *record_
869879 RecordDecl *record_def = record_decl->getDefinition();
870880 unsigned line = c->source_node ? c->source_node->line : 0;
871881 if (!record_def) {
872 LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugForwardDeclType(c->codegen->dbuilder,
873 LLVMZigTag_DW_structure_type(), buf_ptr(full_type_name),
874 LLVMZigFileToScope(c->import->di_file), c->import->di_file, line);
875
876 LLVMZigReplaceTemporary(c->codegen->dbuilder, struct_type->di_type, replacement_di_type);
877 struct_type->di_type = replacement_di_type;
878
882 replace_with_fwd_decl(c, struct_type, full_type_name);
879883 return struct_type;
880884 }
881885
......@@ -890,6 +894,7 @@ static TypeTableEntry *resolve_record_decl(Context *c, const RecordDecl *record_
890894
891895 if (field_decl->isBitField()) {
892896 emit_warning(c, field_decl, "struct %s demoted to typedef - has bitfield\n", buf_ptr(bare_name));
897 replace_with_fwd_decl(c, struct_type, full_type_name);
893898 return struct_type;
894899 }
895900 }
......@@ -918,6 +923,7 @@ static TypeTableEntry *resolve_record_decl(Context *c, const RecordDecl *record_
918923
919924 if (field_type->id == TypeTableEntryIdInvalid) {
920925 emit_warning(c, field_decl, "struct %s demoted to typedef - unresolved type\n", buf_ptr(bare_name));
926 replace_with_fwd_decl(c, struct_type, full_type_name);
921927 return struct_type;
922928 }
923929