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,...@@ -1716,18 +1716,18 @@ struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl,
1716{1716{
1717 AstNode *opaque_node = trans_create_node_opaque(c);1717 AstNode *opaque_node = trans_create_node_opaque(c);
1718 if (full_type_name == nullptr) {1718 if (full_type_name == nullptr) {
1719 c->decl_table.put(enum_decl, opaque_node);1719 c->decl_table.put(enum_decl->getCanonicalDecl(), opaque_node);
1720 return opaque_node;1720 return opaque_node;
1721 }1721 }
1722 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);1722 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
1723 add_global_weak_alias(c, bare_name, full_type_name);1723 add_global_weak_alias(c, bare_name, full_type_name);
1724 add_global_var(c, full_type_name, opaque_node);1724 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);
1726 return symbol_node;1726 return symbol_node;
1727}1727}
17281728
1729static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {1729static 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());
1731 if (existing_entry) {1731 if (existing_entry) {
1732 return existing_entry->value;1732 return existing_entry->value;
1733 }1733 }
...@@ -1792,13 +1792,13 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {...@@ -1792,13 +1792,13 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
1792 }1792 }
17931793
1794 if (is_anonymous) {1794 if (is_anonymous) {
1795 c->decl_table.put(enum_decl, enum_node);1795 c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node);
1796 return enum_node;1796 return enum_node;
1797 } else {1797 } else {
1798 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);1798 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
1799 add_global_weak_alias(c, bare_name, full_type_name);1799 add_global_weak_alias(c, bare_name, full_type_name);
1800 add_global_var(c, full_type_name, enum_node);1800 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);
1802 return enum_node;1802 return enum_node;
1803 }1803 }
1804 }1804 }
...@@ -1822,7 +1822,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {...@@ -1822,7 +1822,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
1822 }1822 }
18231823
1824 if (is_anonymous) {1824 if (is_anonymous) {
1825 c->decl_table.put(enum_decl, enum_node);1825 c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node);
1826 return enum_node;1826 return enum_node;
1827 } else {1827 } else {
1828 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);1828 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...@@ -1837,18 +1837,18 @@ static AstNode *demote_struct_to_opaque(Context *c, const RecordDecl *record_dec
1837{1837{
1838 AstNode *opaque_node = trans_create_node_opaque(c);1838 AstNode *opaque_node = trans_create_node_opaque(c);
1839 if (full_type_name == nullptr) {1839 if (full_type_name == nullptr) {
1840 c->decl_table.put(record_decl, opaque_node);1840 c->decl_table.put(record_decl->getCanonicalDecl(), opaque_node);
1841 return opaque_node;1841 return opaque_node;
1842 }1842 }
1843 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);1843 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
1844 add_global_weak_alias(c, bare_name, full_type_name);1844 add_global_weak_alias(c, bare_name, full_type_name);
1845 add_global_var(c, full_type_name, opaque_node);1845 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);
1847 return symbol_node;1847 return symbol_node;
1848}1848}
18491849
1850static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {1850static 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());
1852 if (existing_entry) {1852 if (existing_entry) {
1853 return existing_entry->value;1853 return existing_entry->value;
1854 }1854 }
...@@ -1857,7 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {...@@ -1857,7 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
18571857
1858 if (!record_decl->isStruct()) {1858 if (!record_decl->isStruct()) {
1859 emit_warning(c, record_decl->getLocation(), "skipping record %s, not a struct", raw_name);1859 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);
1861 return nullptr;1861 return nullptr;
1862 }1862 }
18631863
...@@ -1895,9 +1895,9 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {...@@ -1895,9 +1895,9 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
18951895
1896 // must be before fields in case a circular reference happens1896 // must be before fields in case a circular reference happens
1897 if (is_anonymous) {1897 if (is_anonymous) {
1898 c->decl_table.put(record_decl, struct_node);1898 c->decl_table.put(record_decl->getCanonicalDecl(), struct_node);
1899 } else {1899 } 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));
1901 }1901 }
19021902
1903 uint32_t i = 0;1903 uint32_t i = 0;
...@@ -2189,6 +2189,8 @@ static void process_symbol_macros(Context *c) {...@@ -2189,6 +2189,8 @@ static void process_symbol_macros(Context *c) {
2189static void process_preprocessor_entities(Context *c, ASTUnit &unit) {2189static void process_preprocessor_entities(Context *c, ASTUnit &unit) {
2190 CTokenize ctok = {{0}};2190 CTokenize ctok = {{0}};
21912191
2192 // TODO if we see #undef, delete it from the table
2193
2192 for (PreprocessedEntity *entity : unit.getLocalPreprocessingEntities()) {2194 for (PreprocessedEntity *entity : unit.getLocalPreprocessingEntities()) {
2193 switch (entity->getKind()) {2195 switch (entity->getKind()) {
2194 case PreprocessedEntity::InvalidKind:2196 case PreprocessedEntity::InvalidKind: