From: Ian Lance Taylor Date: Sat, 19 Feb 2011 04:01:32 +0000 (+0000) Subject: Avoid infinite loop inheriting interface methods. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4a28fe2a2bda68125fbdaa605311e9f50ee661bc;p=gcc.git Avoid infinite loop inheriting interface methods. From-SVN: r170303 --- diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 2d7312b6094..90bc4e1d4a9 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -5605,6 +5605,7 @@ Interface_type::finalize_methods() { if (this->methods_ == NULL) return; + std::vector seen; bool is_recursive = false; size_t from = 0; size_t to = 0; @@ -5632,6 +5633,7 @@ Interface_type::finalize_methods() ++from; continue; } + Interface_type* it = p->type()->interface_type(); if (it == NULL) { @@ -5649,6 +5651,27 @@ Interface_type::finalize_methods() ++from; continue; } + + Named_type* nt = p->type()->named_type(); + if (nt != NULL) + { + std::vector::const_iterator q; + for (q = seen.begin(); q != seen.end(); ++q) + { + if (*q == nt) + { + error_at(p->location(), "inherited interface loop"); + break; + } + } + if (q != seen.end()) + { + ++from; + continue; + } + seen.push_back(nt); + } + const Typed_identifier_list* methods = it->methods(); if (methods == NULL) {