Avoid infinite loop inheriting interface methods.
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 19 Feb 2011 04:01:32 +0000 (04:01 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 19 Feb 2011 04:01:32 +0000 (04:01 +0000)
From-SVN: r170303

gcc/go/gofrontend/types.cc

index 2d7312b60940ad7e87c0e1e94e95c1b08ec65055..90bc4e1d4a9d0a83ced2daf3bbf94c854000808f 100644 (file)
@@ -5605,6 +5605,7 @@ Interface_type::finalize_methods()
 {
   if (this->methods_ == NULL)
     return;
+  std::vector<Named_type*> seen;
   bool is_recursive = false;
   size_t from = 0;
   size_t to = 0;
@@ -5632,6 +5633,7 @@ Interface_type::finalize_methods()
          ++from;
          continue;
        }
+
       Interface_type* it = p->type()->interface_type();
       if (it == NULL)
        {
@@ -5649,6 +5651,27 @@ Interface_type::finalize_methods()
          ++from;
          continue;
        }
+
+      Named_type* nt = p->type()->named_type();
+      if (nt != NULL)
+       {
+         std::vector<Named_type*>::const_iterator q;
+         for (q = seen.begin(); q != seen.end(); ++q)
+           {
+             if (*q == nt)
+               {
+                 error_at(p->location(), "inherited interface loop");
+                 break;
+               }
+           }
+         if (q != seen.end())
+           {
+             ++from;
+             continue;
+           }
+         seen.push_back(nt);
+       }
+
       const Typed_identifier_list* methods = it->methods();
       if (methods == NULL)
        {