]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: use package path with embedded builtin type
authorIan Lance Taylor <iant@golang.org>
Sun, 26 Jun 2022 05:09:16 +0000 (22:09 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 28 Jun 2022 17:24:59 +0000 (10:24 -0700)
The test case is https://go.dev/cl/414235.

Fixes golang/go#52856

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/414294

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/names.cc

index 551ea650acf7c52409023816243b8704b0605155..13cb6ea4046f4cbaffe8183d455d0ab59efe0b9f 100644 (file)
@@ -1,4 +1,4 @@
-d5b4abed2f206e492890acc20738e89617ea542c
+c7238f58a26131b7611eff6f555cab02af8a623c
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index f85d84ceadf86055a530f7242d929cf23836f914..dac7f20f5c186faf9aa09136015f9553fcc7b3ca 100644 (file)
@@ -831,15 +831,28 @@ Struct_type::do_mangled_name(Gogo* gogo, std::string* ret,
              ret->push_back(' ');
            }
 
-         // For an anonymous field with an alias type, the field name
-         // is the alias name.
-         if (p->is_anonymous()
-             && p->type()->named_type() != NULL
-             && p->type()->named_type()->is_alias())
-           p->type()->named_type()->append_symbol_type_name(gogo, true, ret,
-                                                            is_non_identifier);
+         const Type* ft = p->type();
+         const Named_type* nt = ft->named_type();
+
+         if (p->is_anonymous() && nt != NULL && nt->is_builtin())
+           {
+             // For an embedded field with a builtin type, we must
+             // include a package path.  Otherwise embedding builtin
+             // types in different packages will produce identical
+             // types, which shouldn't happen because the builtin
+             // types are not exported.
+             ret->append(gogo->pkgpath());
+             ret->push_back('.');
+             nt->append_symbol_type_name(gogo, true, ret, is_non_identifier);
+           }
+         else if (p->is_anonymous() && nt != NULL && nt->is_alias())
+           {
+             // For an anonymous field with an alias type, the field name
+             // is the alias name.
+             nt->append_symbol_type_name(gogo, true, ret, is_non_identifier);
+           }
          else
-           this->append_mangled_name(p->type(), gogo, ret, is_non_identifier);
+           this->append_mangled_name(ft, gogo, ret, is_non_identifier);
 
          if (p->has_tag())
            {