diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -423,7 +423,6 @@ class GenericDetails { public: GenericDetails() {} - GenericDetails(const SymbolVector &specificProcs); GenericKind kind() const { return kind_; } void set_kind(GenericKind kind) { kind_ = kind; } diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -150,9 +150,6 @@ return *this; } -GenericDetails::GenericDetails(const SymbolVector &specificProcs) - : specificProcs_{specificProcs} {} - void GenericDetails::AddSpecificProc( const Symbol &proc, SourceName bindingName) { specificProcs_.push_back(proc); @@ -186,6 +183,8 @@ } void GenericDetails::CopyFrom(const GenericDetails &from) { + CHECK(specificProcs_.size() == bindingNames_.size()); + CHECK(from.specificProcs_.size() == from.bindingNames_.size()); if (from.specific_) { CHECK(!specific_ || specific_ == from.specific_); specific_ = from.specific_; @@ -194,11 +193,13 @@ CHECK(!derivedType_ || derivedType_ == from.derivedType_); derivedType_ = from.derivedType_; } - for (const Symbol &symbol : from.specificProcs_) { + for (std::size_t i{0}; i < from.specificProcs_.size(); ++i) { if (std::find_if(specificProcs_.begin(), specificProcs_.end(), - [&](const Symbol &mySymbol) { return &mySymbol == &symbol; }) == - specificProcs_.end()) { - specificProcs_.push_back(symbol); + [&](const Symbol &mySymbol) { + return &mySymbol == &*from.specificProcs_[i]; + }) == specificProcs_.end()) { + specificProcs_.push_back(from.specificProcs_[i]); + bindingNames_.push_back(from.bindingNames_[i]); } } } diff --git a/flang/test/Semantics/resolve53.f90 b/flang/test/Semantics/resolve53.f90 --- a/flang/test/Semantics/resolve53.f90 +++ b/flang/test/Semantics/resolve53.f90 @@ -457,3 +457,26 @@ integer :: i, j end end + +module m20 + interface operator(.not.) + real function f(x) + character(*),intent(in) :: x + end function + end interface + interface operator(+) + procedure f + end interface +end module + +subroutine s1() + use m20 + interface operator(.not.) + !ERROR: Procedure 'f' is already specified in generic 'operator(.not.)' + procedure f + end interface + interface operator(+) + !ERROR: Procedure 'f' is already specified in generic 'operator(+)' + procedure f + end interface +end subroutine s1