This patch fixes the Go frontend to not dereference an unknown type when importing an anonymous field. This fixes a bug in a recent patch I committed. I have a test case ready to commit to the master repository after the Go 1.2 release is made. This patch bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline and 4.8 branch.
Ian
diff -r 742104f0d4c7 go/types.cc --- a/go/types.cc Wed Oct 16 06:37:07 2013 -0700 +++ b/go/types.cc Thu Oct 17 08:39:50 2013 -0700 @@ -5263,11 +5263,25 @@ // that an embedded builtin type is accessible from another // package (we know that all the builtin types are not // exported). - if (name.empty() && ftype->deref()->named_type() != NULL) + // This is called during parsing, before anything is + // lowered, so we have to be careful to avoid dereferencing + // an unknown type name. + if (name.empty()) { - const std::string fn(ftype->deref()->named_type()->name()); - if (fn[0] >= 'a' && fn[0] <= 'z') - name = '.' + imp->package()->pkgpath() + '.' + fn; + Type *t = ftype; + if (t->classification() == Type::TYPE_POINTER) + { + // Very ugly. + Pointer_type* ptype = static_cast<Pointer_type*>(t); + t = ptype->points_to(); + } + std::string tname; + if (t->forward_declaration_type() != NULL) + tname = t->forward_declaration_type()->name(); + else if (t->named_type() != NULL) + tname = t->named_type()->name(); + if (!tname.empty() && tname[0] >= 'a' && tname[0] <= 'z') + name = '.' + imp->package()->pkgpath() + '.' + tname; } Struct_field sf(Typed_identifier(name, ftype, imp->location()));