diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-09-19 23:44:39 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-09-19 23:44:39 +0000 |
commit | a6bede1bb2cd6953928017ca8160b188a2405e1c (patch) | |
tree | 0db46268976393f58e9caf0817dc4353300e2189 /gcc | |
parent | 4ec5affac92bd2e50aeae34fa9beceaf398a7377 (diff) | |
download | gcc-a6bede1bb2cd6953928017ca8160b188a2405e1c.zip gcc-a6bede1bb2cd6953928017ca8160b188a2405e1c.tar.gz gcc-a6bede1bb2cd6953928017ca8160b188a2405e1c.tar.bz2 |
Fix handling of mutually recursive named types.
From-SVN: r178989
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/go/gofrontend/types.cc | 42 | ||||
-rw-r--r-- | gcc/go/gofrontend/types.h | 6 |
2 files changed, 25 insertions, 23 deletions
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 21c5ba2..fa3332a 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -6251,22 +6251,22 @@ Named_type::message_name() const Type* Named_type::named_base() { - if (this->seen_ > 0) + if (this->seen_) return this; - ++this->seen_; + this->seen_ = true; Type* ret = this->type_->base(); - --this->seen_; + this->seen_ = false; return ret; } const Type* Named_type::named_base() const { - if (this->seen_ > 0) + if (this->seen_) return this; - ++this->seen_; + this->seen_ = true; const Type* ret = this->type_->base(); - --this->seen_; + this->seen_ = false; return ret; } @@ -6276,11 +6276,11 @@ Named_type::named_base() const bool Named_type::is_named_error_type() const { - if (this->seen_ > 0) + if (this->seen_) return false; - ++this->seen_; + this->seen_ = true; bool ret = this->type_->is_error_type(); - --this->seen_; + this->seen_ = false; return ret; } @@ -6430,11 +6430,11 @@ Named_type::interface_method_table(Gogo* gogo, const Interface_type* interface, bool Named_type::named_type_has_hidden_fields(std::string* reason) const { - if (this->seen_ > 0) + if (this->seen_) return false; - ++this->seen_; + this->seen_ = true; bool ret = this->type_->has_hidden_fields(this, reason); - --this->seen_; + this->seen_ = false; return ret; } @@ -6600,11 +6600,11 @@ Named_type::do_verify() bool Named_type::do_has_pointer() const { - if (this->seen_ > 0) + if (this->seen_) return false; - ++this->seen_; + this->seen_ = true; bool ret = this->type_->has_pointer(); - --this->seen_; + this->seen_ = false; return ret; } @@ -6906,14 +6906,14 @@ Named_type::do_get_backend(Gogo* gogo) case TYPE_FUNCTION: // Don't build a circular data structure. GENERIC can't handle // it. - if (this->seen_ > 0) + if (this->seen_in_get_backend_) { this->is_circular_ = true; return gogo->backend()->circular_pointer_type(bt, true); } - ++this->seen_; + this->seen_in_get_backend_ = true; bt1 = Type::get_named_base_btype(gogo, base); - --this->seen_; + this->seen_in_get_backend_ = false; if (this->is_circular_) bt1 = gogo->backend()->circular_pointer_type(bt, true); if (!gogo->backend()->set_placeholder_function_type(bt, bt1)) @@ -6923,14 +6923,14 @@ Named_type::do_get_backend(Gogo* gogo) case TYPE_POINTER: // Don't build a circular data structure. GENERIC can't handle // it. - if (this->seen_ > 0) + if (this->seen_in_get_backend_) { this->is_circular_ = true; return gogo->backend()->circular_pointer_type(bt, false); } - ++this->seen_; + this->seen_in_get_backend_ = true; bt1 = Type::get_named_base_btype(gogo, base); - --this->seen_; + this->seen_in_get_backend_ = false; if (this->is_circular_) bt1 = gogo->backend()->circular_pointer_type(bt, false); if (!gogo->backend()->set_placeholder_pointer_type(bt, bt1)) diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h index f6c8642..cb3fcaa7 100644 --- a/gcc/go/gofrontend/types.h +++ b/gcc/go/gofrontend/types.h @@ -2387,7 +2387,7 @@ class Named_type : public Type interface_method_tables_(NULL), pointer_interface_method_tables_(NULL), location_(location), named_btype_(NULL), dependencies_(), is_visible_(true), is_error_(false), is_converted_(false), - is_circular_(false), seen_(0) + is_circular_(false), seen_(false), seen_in_get_backend_(false) { } // Return the associated Named_object. This holds the actual name. @@ -2647,7 +2647,9 @@ class Named_type : public Type // used to prevent infinite recursion when a type refers to itself. // This is mutable because it is always reset to false when the // function exits. - mutable int seen_; + mutable bool seen_; + // Like seen_, but used only by do_get_backend. + bool seen_in_get_backend_; }; // A forward declaration. This handles a type which has been declared |