]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Rework handling of recursive function types.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 16 Dec 2010 02:24:10 +0000 (02:24 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 16 Dec 2010 02:24:10 +0000 (02:24 +0000)
From-SVN: r167898

gcc/go/gofrontend/types.cc

index bd0c7e5a58cdb0a8bb313b8c703c796252463b6f..af541e8eb515558ac876807c70b59bb20528d4f7 100644 (file)
@@ -6887,11 +6887,17 @@ Named_type::do_get_tree(Gogo* gogo)
       break;
 
     case TYPE_FUNCTION:
-      // Don't recur infinitely if a function type refers to itself.
-      // Ideally we would build a circular data structure here, but
-      // GENERIC can't handle them.
+      // GENERIC can't handle a pointer to a function type whose
+      // return type is a pointer to the function type itself.  It
+      // does into infinite loops when walking the types.
       if (this->seen_)
-       return ptr_type_node;
+       {
+         Function_type* fntype = this->type_->function_type();
+         if (fntype->results() != NULL
+             && fntype->results()->size() == 1
+             && fntype->results()->front().type()->forwarded() == this)
+           return ptr_type_node;
+       }
       this->seen_ = true;
       t = Type::get_named_type_tree(gogo, this->type_);
       this->seen_ = false;