compiler: Fix handling of invalid types within invalid types.

From-SVN: r184674
This commit is contained in:
Ian Lance Taylor 2012-02-29 22:43:15 +00:00
parent a339c9d606
commit a0c996ea7f
2 changed files with 7 additions and 20 deletions

View File

@ -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;

View File

@ -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(); }