mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-27 09:34:14 +08:00
Avoid endless loop inheriting interfaces.
From-SVN: r168216
This commit is contained in:
parent
e99776d82a
commit
ae4aefdca3
@ -5548,7 +5548,7 @@ Interface_type::finalize_methods()
|
||||
const Typed_identifier* p = &this->methods_->at(from);
|
||||
if (!p->name().empty())
|
||||
{
|
||||
size_t i = 0;
|
||||
size_t i;
|
||||
for (i = 0; i < to; ++i)
|
||||
{
|
||||
if (this->methods_->at(i).name() == p->name())
|
||||
@ -5594,7 +5594,30 @@ Interface_type::finalize_methods()
|
||||
q != methods->end();
|
||||
++q)
|
||||
{
|
||||
if (q->name().empty() || this->find_method(q->name()) == NULL)
|
||||
if (q->name().empty())
|
||||
{
|
||||
if (q->type() == p->type())
|
||||
error_at(p->location(), "interface inheritance loop");
|
||||
else
|
||||
{
|
||||
size_t i;
|
||||
for (i = from + 1; i < this->methods_->size(); ++i)
|
||||
{
|
||||
const Typed_identifier* r = &this->methods_->at(i);
|
||||
if (r->name().empty() && r->type() == q->type())
|
||||
{
|
||||
error_at(p->location(),
|
||||
"inherited interface listed twice");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == this->methods_->size())
|
||||
this->methods_->push_back(Typed_identifier(q->name(),
|
||||
q->type(),
|
||||
p->location()));
|
||||
}
|
||||
}
|
||||
else if (this->find_method(q->name()) == NULL)
|
||||
this->methods_->push_back(Typed_identifier(q->name(), q->type(),
|
||||
p->location()));
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user