aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-09-19 23:44:39 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-09-19 23:44:39 +0000
commita6bede1bb2cd6953928017ca8160b188a2405e1c (patch)
tree0db46268976393f58e9caf0817dc4353300e2189 /gcc
parent4ec5affac92bd2e50aeae34fa9beceaf398a7377 (diff)
downloadgcc-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.cc42
-rw-r--r--gcc/go/gofrontend/types.h6
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