From: Ian Lance Taylor Date: Tue, 14 Dec 2010 17:57:20 +0000 (+0000) Subject: Correct protection against recursive types. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=894503cb3174b232a287581cfa2030139efce614;p=gcc.git Correct protection against recursive types. From-SVN: r167807 --- diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 8d440a89d4a..98c4a979840 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -6795,14 +6795,10 @@ Named_type::do_get_tree(Gogo* gogo) break; case TYPE_FUNCTION: - // 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_ - && this->function_type()->results() != NULL - && this->function_type()->results()->size() == 1 - && (this->function_type()->results()->front().type()->forwarded() - == this)) + // 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. + if (this->seen_) return ptr_type_node; this->seen_ = true; t = Type::get_named_type_tree(gogo, this->type_); @@ -6813,9 +6809,10 @@ Named_type::do_get_tree(Gogo* gogo) break; case TYPE_POINTER: - // GENERIC can't handle a pointer type which points to itself. - // It goes into infinite loops when walking the types. - if (this->seen_ && this->points_to()->forwarded() == this) + // Don't recur infinitely if a pointer type refers to itself. + // Ideally we would build a circular data structure here, but + // GENERIC can't handle them. + if (this->seen_) return ptr_type_node; this->seen_ = true; t = Type::get_named_type_tree(gogo, this->type_);