From 87970920c493de2f2d4606dfef92bb847e07105f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 5 Sep 2017 02:34:06 -0400 Subject: parseh: fix duplicate definitions --- src/parseh.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/parseh.cpp') diff --git a/src/parseh.cpp b/src/parseh.cpp index 082cf30233..bfc5ee7dda 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -1716,18 +1716,18 @@ struct AstNode *demote_enum_to_opaque(Context *c, const EnumDecl *enum_decl, { AstNode *opaque_node = trans_create_node_opaque(c); if (full_type_name == nullptr) { - c->decl_table.put(enum_decl, opaque_node); + c->decl_table.put(enum_decl->getCanonicalDecl(), opaque_node); return opaque_node; } AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); add_global_weak_alias(c, bare_name, full_type_name); add_global_var(c, full_type_name, opaque_node); - c->decl_table.put(enum_decl, symbol_node); + c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node); return symbol_node; } static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { - auto existing_entry = c->decl_table.maybe_get((void*)enum_decl); + auto existing_entry = c->decl_table.maybe_get((void*)enum_decl->getCanonicalDecl()); if (existing_entry) { return existing_entry->value; } @@ -1792,13 +1792,13 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { } if (is_anonymous) { - c->decl_table.put(enum_decl, enum_node); + c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node); return enum_node; } else { AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); add_global_weak_alias(c, bare_name, full_type_name); add_global_var(c, full_type_name, enum_node); - c->decl_table.put(enum_decl, symbol_node); + c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node); return enum_node; } } @@ -1822,7 +1822,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { } if (is_anonymous) { - c->decl_table.put(enum_decl, enum_node); + c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node); return enum_node; } else { 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 { AstNode *opaque_node = trans_create_node_opaque(c); if (full_type_name == nullptr) { - c->decl_table.put(record_decl, opaque_node); + c->decl_table.put(record_decl->getCanonicalDecl(), opaque_node); return opaque_node; } AstNode *symbol_node = trans_create_node_symbol(c, full_type_name); add_global_weak_alias(c, bare_name, full_type_name); add_global_var(c, full_type_name, opaque_node); - c->decl_table.put(record_decl, symbol_node); + c->decl_table.put(record_decl->getCanonicalDecl(), symbol_node); return symbol_node; } static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { - auto existing_entry = c->decl_table.maybe_get((void*)record_decl); + auto existing_entry = c->decl_table.maybe_get((void*)record_decl->getCanonicalDecl()); if (existing_entry) { return existing_entry->value; } @@ -1857,7 +1857,7 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { if (!record_decl->isStruct()) { emit_warning(c, record_decl->getLocation(), "skipping record %s, not a struct", raw_name); - c->decl_table.put(record_decl, nullptr); + c->decl_table.put(record_decl->getCanonicalDecl(), nullptr); return nullptr; } @@ -1895,9 +1895,9 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) { // must be before fields in case a circular reference happens if (is_anonymous) { - c->decl_table.put(record_decl, struct_node); + c->decl_table.put(record_decl->getCanonicalDecl(), struct_node); } else { - c->decl_table.put(record_decl, trans_create_node_symbol(c, full_type_name)); + c->decl_table.put(record_decl->getCanonicalDecl(), trans_create_node_symbol(c, full_type_name)); } uint32_t i = 0; @@ -2189,6 +2189,8 @@ static void process_symbol_macros(Context *c) { static void process_preprocessor_entities(Context *c, ASTUnit &unit) { CTokenize ctok = {{0}}; + // TODO if we see #undef, delete it from the table + for (PreprocessedEntity *entity : unit.getLocalPreprocessingEntities()) { switch (entity->getKind()) { case PreprocessedEntity::InvalidKind: -- cgit v1.2.3