authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-05 02:34:06-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-05 02:34:06-04:00
log87970920c493de2f2d4606dfef92bb847e07105f
tree263b660b5a7aa751982c90bd706c2e3026cf6201
parent5c386f99117230ff84d177395d6e14645f61bf2d

parseh: fix duplicate definitions


1 files changed, 14 insertions(+), 12 deletions(-)

src/parseh.cpp+14-12
......@@ -1716,18 +1716,18 @@ struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl,
17161716{
17171717 AstNode *opaque_node = trans_create_node_opaque(c);
17181718 if (full_type_name == nullptr) {
1719 c->decl_table.put(enum_decl, opaque_node);
1719 c->decl_table.put(enum_decl->getCanonicalDecl(), opaque_node);
17201720 return opaque_node;
17211721 }
17221722 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
17231723 add_global_weak_alias(c, bare_name, full_type_name);
17241724 add_global_var(c, full_type_name, opaque_node);
1725 c->decl_table.put(enum_decl, symbol_node);
1725 c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node);
17261726 return symbol_node;
17271727}
17281728
17291729static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
1730 auto existing_entry = c->decl_table.maybe_get((void*)enum_decl);
1730 auto existing_entry = c->decl_table.maybe_get((void*)enum_decl->getCanonicalDecl());
17311731 if (existing_entry) {
17321732 return existing_entry->value;
17331733 }
......@@ -1792,13 +1792,13 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
17921792 }
17931793
17941794 if (is_anonymous) {
1795 c->decl_table.put(enum_decl, enum_node);
1795 c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node);
17961796 return enum_node;
17971797 } else {
17981798 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
17991799 add_global_weak_alias(c, bare_name, full_type_name);
18001800 add_global_var(c, full_type_name, enum_node);
1801 c->decl_table.put(enum_decl, symbol_node);
1801 c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node);
18021802 return enum_node;
18031803 }
18041804 }
......@@ -1822,7 +1822,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
18221822 }
18231823
18241824 if (is_anonymous) {
1825 c->decl_table.put(enum_decl, enum_node);
1825 c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node);
18261826 return enum_node;
18271827 } else {
18281828 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
......@@ -1837,18 +1837,18 @@ static AstNode *demote_struct_to_opaque(Context *c, const RecordDecl *record_dec
18371837{
18381838 AstNode *opaque_node = trans_create_node_opaque(c);
18391839 if (full_type_name == nullptr) {
1840 c->decl_table.put(record_decl, opaque_node);
1840 c->decl_table.put(record_decl->getCanonicalDecl(), opaque_node);
18411841 return opaque_node;
18421842 }
18431843 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
18441844 add_global_weak_alias(c, bare_name, full_type_name);
18451845 add_global_var(c, full_type_name, opaque_node);
1846 c->decl_table.put(record_decl, symbol_node);
1846 c->decl_table.put(record_decl->getCanonicalDecl(), symbol_node);
18471847 return symbol_node;
18481848}
18491849
18501850static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
1851 auto existing_entry = c->decl_table.maybe_get((void*)record_decl);
1851 auto existing_entry = c->decl_table.maybe_get((void*)record_decl->getCanonicalDecl());
18521852 if (existing_entry) {
18531853 return existing_entry->value;
18541854 }
......@@ -1857,7 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
18571857
18581858 if (!record_decl->isStruct()) {
18591859 emit_warning(c, record_decl->getLocation(), "skipping record %s, not a struct", raw_name);
1860 c->decl_table.put(record_decl, nullptr);
1860 c->decl_table.put(record_decl->getCanonicalDecl(), nullptr);
18611861 return nullptr;
18621862 }
18631863
......@@ -1895,9 +1895,9 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
18951895
18961896 // must be before fields in case a circular reference happens
18971897 if (is_anonymous) {
1898 c->decl_table.put(record_decl, struct_node);
1898 c->decl_table.put(record_decl->getCanonicalDecl(), struct_node);
18991899 } else {
1900 c->decl_table.put(record_decl, trans_create_node_symbol(c, full_type_name));
1900 c->decl_table.put(record_decl->getCanonicalDecl(), trans_create_node_symbol(c, full_type_name));
19011901 }
19021902
19031903 uint32_t i = 0;
......@@ -2189,6 +2189,8 @@ static void process_symbol_macros(Context *c) {
21892189static void process_preprocessor_entities(Context *c, ASTUnit &unit) {
21902190 CTokenize ctok = {{0}};
21912191
2192 // TODO if we see #undef, delete it from the table
2193
21922194 for (PreprocessedEntity *entity : unit.getLocalPreprocessingEntities()) {
21932195 switch (entity->getKind()) {
21942196 case PreprocessedEntity::InvalidKind: