aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-02-29 22:43:15 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-02-29 22:43:15 +0000
commita0c996ea7f9fa3f69670cc70642b61ca82c91f3e (patch)
tree3db4b308fcc58d4435855f40dafafe7ab8c873fe /gcc/go
parenta339c9d606640b6161b8c623041bd6c403b4bcb3 (diff)
downloadgcc-a0c996ea7f9fa3f69670cc70642b61ca82c91f3e.zip
gcc-a0c996ea7f9fa3f69670cc70642b61ca82c91f3e.tar.gz
gcc-a0c996ea7f9fa3f69670cc70642b61ca82c91f3e.tar.bz2
compiler: Fix handling of invalid types within invalid types.
From-SVN: r184674
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/types.cc24
-rw-r--r--gcc/go/gofrontend/types.h3
2 files changed, 7 insertions, 20 deletions
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index a2064bb..6abe21d 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -4116,7 +4116,6 @@ Struct_type::do_verify()
Struct_field_list* fields = this->fields_;
if (fields == NULL)
return true;
- bool ret = true;
for (Struct_field_list::iterator p = fields->begin();
p != fields->end();
++p)
@@ -4126,7 +4125,6 @@ Struct_type::do_verify()
{
error_at(p->location(), "struct field type is incomplete");
p->set_type(Type::make_error_type());
- ret = false;
}
else if (p->is_anonymous())
{
@@ -4134,19 +4132,17 @@ Struct_type::do_verify()
{
error_at(p->location(), "embedded type may not be a pointer");
p->set_type(Type::make_error_type());
- return false;
}
- if (t->points_to() != NULL
- && t->points_to()->interface_type() != NULL)
+ else if (t->points_to() != NULL
+ && t->points_to()->interface_type() != NULL)
{
error_at(p->location(),
"embedded type may not be pointer to interface");
p->set_type(Type::make_error_type());
- return false;
}
}
}
- return ret;
+ return true;
}
// Whether this contains a pointer.
@@ -5206,10 +5202,7 @@ bool
Array_type::do_verify()
{
if (!this->verify_length())
- {
- this->length_ = Expression::make_error(this->length_->location());
- return false;
- }
+ this->length_ = Expression::make_error(this->length_->location());
return true;
}
@@ -5899,10 +5892,7 @@ Map_type::do_verify()
{
// The runtime support uses "map[void]void".
if (!this->key_type_->is_comparable() && !this->key_type_->is_void_type())
- {
- error_at(this->location_, "invalid map key type");
- return false;
- }
+ error_at(this->location_, "invalid map key type");
return true;
}
@@ -7885,7 +7875,6 @@ Named_type::do_verify()
if (this->local_methods_ != NULL)
{
Struct_type* st = this->type_->struct_type();
- bool found_dup = false;
if (st != NULL)
{
for (Bindings::const_declarations_iterator p =
@@ -7899,12 +7888,9 @@ Named_type::do_verify()
error_at(p->second->location(),
"method %qs redeclares struct field name",
Gogo::message_name(name).c_str());
- found_dup = true;
}
}
}
- if (found_dup)
- return false;
}
return true;
diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h
index 72c42eb..3fe8048 100644
--- a/gcc/go/gofrontend/types.h
+++ b/gcc/go/gofrontend/types.h
@@ -510,7 +510,8 @@ class Type
// Verify the type. This is called after parsing, and verifies that
// types are complete and meet the language requirements. This
- // returns false if the type is invalid.
+ // returns false if the type is invalid and we should not continue
+ // traversing it.
bool
verify()
{ return this->do_verify(); }