| ... | ... | @@ -40,6 +40,7 @@ struct Context { |
| 40 | 40 | SourceManager *source_manager; |
| 41 | 41 | ZigList<AstNode *> aliases; |
| 42 | 42 | ZigList<MacroSymbol> macro_symbols; |
| 43 | uint32_t *next_node_index; |
| 43 | 44 | }; |
| 44 | 45 | |
| 45 | 46 | static AstNode *make_qual_type_node(Context *c, QualType qt, const Decl *decl); |
| ... | ... | @@ -76,6 +77,8 @@ static AstNode *create_node(Context *c, NodeType type) { |
| 76 | 77 | AstNode *node = allocate<AstNode>(1); |
| 77 | 78 | node->type = type; |
| 78 | 79 | node->owner = c->import; |
| 80 | node->create_index = *c->next_node_index; |
| 81 | *c->next_node_index += 1; |
| 79 | 82 | return node; |
| 80 | 83 | } |
| 81 | 84 | |
| ... | ... | @@ -398,7 +401,10 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl, |
| 398 | 401 | { |
| 399 | 402 | const RecordType *record_ty = static_cast<const RecordType*>(ty); |
| 400 | 403 | Buf *record_name = buf_create_from_str(decl_name(record_ty->getDecl())); |
| 401 | | if (type_table->maybe_get(record_name)) { |
| 404 | if (buf_len(record_name) == 0) { |
| 405 | emit_warning(c, decl, "unhandled anonymous struct"); |
| 406 | return nullptr; |
| 407 | } else if (type_table->maybe_get(record_name)) { |
| 402 | 408 | const char *prefix_str; |
| 403 | 409 | if (type_table == &c->enum_type_table) { |
| 404 | 410 | prefix_str = "enum_"; |
| ... | ... | @@ -416,7 +422,10 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl, |
| 416 | 422 | { |
| 417 | 423 | const EnumType *enum_ty = static_cast<const EnumType*>(ty); |
| 418 | 424 | Buf *record_name = buf_create_from_str(decl_name(enum_ty->getDecl())); |
| 419 | | if (type_table->maybe_get(record_name)) { |
| 425 | if (buf_len(record_name) == 0) { |
| 426 | emit_warning(c, decl, "unhandled anonymous enum"); |
| 427 | return nullptr; |
| 428 | } else if (type_table->maybe_get(record_name)) { |
| 420 | 429 | const char *prefix_str; |
| 421 | 430 | if (type_table == &c->enum_type_table) { |
| 422 | 431 | prefix_str = "enum_"; |
| ... | ... | @@ -560,6 +569,10 @@ static void visit_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) |
| 560 | 569 | return; |
| 561 | 570 | } |
| 562 | 571 | |
| 572 | // if the underlying type is anonymous, we can special case it to just |
| 573 | // use the name of this typedef |
| 574 | // TODO |
| 575 | |
| 563 | 576 | add_typedef_node(c, type_name, make_qual_type_node(c, child_qt, typedef_decl)); |
| 564 | 577 | } |
| 565 | 578 | |
| ... | ... | @@ -650,13 +663,24 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) { |
| 650 | 663 | } |
| 651 | 664 | |
| 652 | 665 | static void visit_record_decl(Context *c, const RecordDecl *record_decl) { |
| 653 | | Buf *bare_name = buf_create_from_str(decl_name(record_decl)); |
| 666 | const char *raw_name = decl_name(record_decl); |
| 667 | |
| 668 | if (record_decl->isAnonymousStructOrUnion() || raw_name[0] == 0) { |
| 669 | return; |
| 670 | } |
| 671 | |
| 672 | Buf *bare_name = buf_create_from_str(raw_name); |
| 654 | 673 | |
| 655 | 674 | if (!record_decl->isStruct()) { |
| 656 | 675 | emit_warning(c, record_decl, "skipping record %s, not a struct", buf_ptr(bare_name)); |
| 657 | 676 | return; |
| 658 | 677 | } |
| 659 | 678 | |
| 679 | if (buf_len(bare_name) == 0) { |
| 680 | emit_warning(c, record_decl, "skipping anonymous struct"); |
| 681 | return; |
| 682 | } |
| 683 | |
| 660 | 684 | Buf *full_type_name = buf_sprintf("struct_%s", buf_ptr(bare_name)); |
| 661 | 685 | |
| 662 | 686 | if (c->struct_type_table.maybe_get(bare_name)) { |
| ... | ... | @@ -1030,7 +1054,8 @@ static void process_preprocessor_entities(Context *c, ASTUnit &unit) { |
| 1030 | 1054 | } |
| 1031 | 1055 | |
| 1032 | 1056 | int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *source, |
| 1033 | | const char **args, int args_len, const char *libc_include_path, bool warnings_on) |
| 1057 | const char **args, int args_len, const char *libc_include_path, bool warnings_on, |
| 1058 | uint32_t *next_node_index) |
| 1034 | 1059 | { |
| 1035 | 1060 | int err; |
| 1036 | 1061 | Buf tmp_file_path = BUF_INIT; |
| ... | ... | @@ -1047,7 +1072,7 @@ int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *sour |
| 1047 | 1072 | clang_argv.append(args[i]); |
| 1048 | 1073 | } |
| 1049 | 1074 | |
| 1050 | | err = parse_h_file(import, errors, &clang_argv, warnings_on); |
| 1075 | err = parse_h_file(import, errors, &clang_argv, warnings_on, next_node_index); |
| 1051 | 1076 | |
| 1052 | 1077 | os_delete_file(&tmp_file_path); |
| 1053 | 1078 | |
| ... | ... | @@ -1055,7 +1080,7 @@ int parse_h_buf(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, Buf *sour |
| 1055 | 1080 | } |
| 1056 | 1081 | |
| 1057 | 1082 | int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, |
| 1058 | | ZigList<const char *> *clang_argv, bool warnings_on) |
| 1083 | ZigList<const char *> *clang_argv, bool warnings_on, uint32_t *next_node_index) |
| 1059 | 1084 | { |
| 1060 | 1085 | Context context = {0}; |
| 1061 | 1086 | Context *c = &context; |
| ... | ... | @@ -1068,6 +1093,7 @@ int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, |
| 1068 | 1093 | c->struct_type_table.init(8); |
| 1069 | 1094 | c->fn_table.init(8); |
| 1070 | 1095 | c->macro_table.init(8); |
| 1096 | c->next_node_index = next_node_index; |
| 1071 | 1097 | |
| 1072 | 1098 | char *ZIG_PARSEH_CFLAGS = getenv("ZIG_PARSEH_CFLAGS"); |
| 1073 | 1099 | if (ZIG_PARSEH_CFLAGS) { |