This patch by Ben Shi fixes the Go frontend to check for recursive inherited interface aliases. This avoids a compiler crash as described at https://golang.org/issue/25302. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 269240) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -9c1859b8e97242b0e697a3aaa39a4da5e6172e74 +2c74b84184941ebea318f69fe43a81f657790b63 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/types.cc =================================================================== --- gcc/go/gofrontend/types.cc (revision 269196) +++ gcc/go/gofrontend/types.cc (working copy) @@ -10329,6 +10329,23 @@ Find_alias::type(Type* type) return TRAVERSE_SKIP_COMPONENTS; } + // Check if there are recursive inherited interface aliases. + Interface_type* ift = type->interface_type(); + if (ift != NULL) + { + const Typed_identifier_list* methods = ift->local_methods(); + if (methods == NULL) + return TRAVERSE_CONTINUE; + for (Typed_identifier_list::const_iterator p = methods->begin(); + p != methods->end(); + ++p) + if (p->name().empty() && p->type()->named_type() == this->find_type_) + { + this->found_ = true; + return TRAVERSE_EXIT; + } + } + return TRAVERSE_CONTINUE; }