From 98e3c7911cbbd6dc0d0e45775e424e448b8c651a Mon Sep 17 00:00:00 2001 From: dimenus Date: Mon, 13 Nov 2017 16:37:46 -0600 Subject: [PATCH 1/2] Fixed duplicate decl detection for typedefs/enums --- src/link.cpp | 9 +++++++-- src/parsec.cpp | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/link.cpp b/src/link.cpp index 1a166a444f..bc84b27b89 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -485,8 +485,13 @@ static void construct_linker_job_coff(LinkJob *lj) { continue; } if (link_lib->provided_explicitly) { - Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib->name)); - lj->args.append(buf_ptr(arg)); + if (lj->codegen->zig_target.env_type == ZigLLVM_GNU) { + Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib->name)); + lj->args.append(buf_ptr(arg)); + } + else { + lj->args.append(buf_ptr(link_lib->name)); + } } else { buf_resize(def_contents, 0); buf_appendf(def_contents, "LIBRARY %s\nEXPORTS\n", buf_ptr(link_lib->name)); diff --git a/src/parsec.cpp b/src/parsec.cpp index 09f5be0fa7..7487435f2c 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -2569,11 +2569,10 @@ static AstNode *resolve_typdef_as_builtin(Context *c, const TypedefNameDecl *typ } static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl) { - auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl); + auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl->getCanonicalDecl()); if (existing_entry) { return existing_entry->value; } - QualType child_qt = typedef_decl->getUnderlyingType(); Buf *type_name = buf_create_from_str(decl_name(typedef_decl)); @@ -2616,7 +2615,7 @@ static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_ add_global_var(c, type_name, type_node); AstNode *symbol_node = trans_create_node_symbol(c, type_name); - c->decl_table.put(typedef_decl, symbol_node); + c->decl_table.put(typedef_decl->getCanonicalDecl(), symbol_node); return symbol_node; } @@ -2742,6 +2741,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) { 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->getCanonicalDecl(), symbol_node); return symbol_node; } } From 03732860bee5c123f24781928e7aa01fce05d5ea Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 13 Nov 2017 22:33:41 -0500 Subject: [PATCH 2/2] add test case for previous commit --- test/parsec.zig | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/parsec.zig b/test/parsec.zig index c8e16755df..9b3e8164fc 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -619,6 +619,17 @@ pub fn addCases(cases: &tests.ParseCContext) { \\ }; \\} ); + + cases.addC("duplicate typedef", + \\typedef long foo; + \\typedef int bar; + \\typedef long foo; + \\typedef int baz; + , + \\pub const foo = c_long; + \\pub const bar = c_int; + \\pub const baz = c_int; + ); }