aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/go/gofrontend/types.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index bd0c7e5..af541e8 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -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;