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;
 }
 

Reply via email to