diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -681,7 +681,9 @@ bool isAbstract() const; protected: - GenericDetails &GetGenericDetails(); + Symbol &GetGenericSymbol() { + return DEREF(genericInfo_.top().symbol); + } // Add to generic the symbol for the subprogram with the same name void CheckGenericProcedures(Symbol &); @@ -2681,9 +2683,6 @@ bool InterfaceVisitor::isAbstract() const { return !genericInfo_.empty() && GetGenericInfo().isAbstract; } -GenericDetails &InterfaceVisitor::GetGenericDetails() { - return GetGenericInfo().symbol->get(); -} void InterfaceVisitor::AddSpecificProcs( const std::list &names, ProcedureKind kind) { @@ -2885,7 +2884,9 @@ if (funcInfo_.parsedType) { messageHandler().set_currStmtSource(funcInfo_.source); if (const auto *type{ProcessTypeSpec(*funcInfo_.parsedType, true)}) { - funcInfo_.resultSymbol->SetType(*type); + if (!context().HasError(funcInfo_.resultSymbol)) { + funcInfo_.resultSymbol->SetType(*type); + } } } funcInfo_ = {}; @@ -2945,11 +2946,16 @@ funcResultName = &name; } // add function result to function scope - EntityDetails funcResultDetails; - funcResultDetails.set_funcResult(true); - funcInfo_.resultSymbol = - &MakeSymbol(*funcResultName, std::move(funcResultDetails)); - details.set_result(*funcInfo_.resultSymbol); + if (details.isFunction()) { + CHECK(context().HasError(currScope().symbol())); + } else { + // add function result to function scope + EntityDetails funcResultDetails; + funcResultDetails.set_funcResult(true); + funcInfo_.resultSymbol = + &MakeSymbol(*funcResultName, std::move(funcResultDetails)); + details.set_result(*funcInfo_.resultSymbol); + } // C1560. if (funcInfo_.resultName && funcInfo_.resultName->source == name.source) { @@ -3223,7 +3229,13 @@ MakeExternal(*symbol); } if (isGeneric()) { - GetGenericDetails().AddSpecificProc(*symbol, name.source); + Symbol &genericSymbol{GetGenericSymbol()}; + if (genericSymbol.has()) { + genericSymbol.get().AddSpecificProc( + *symbol, name.source); + } else { + CHECK(context().HasError(genericSymbol)); + } } set_inheritFromParent(false); } diff --git a/flang/test/Semantics/resolve18.f90 b/flang/test/Semantics/resolve18.f90 --- a/flang/test/Semantics/resolve18.f90 +++ b/flang/test/Semantics/resolve18.f90 @@ -121,3 +121,64 @@ end subroutine f8 end interface g8 end module m8 + +module m9 + type f9 + end type f9 + !ERROR: 'f9' is already declared in this scoping unit + interface f9 + real function f9() + end function f9 + end interface f9 +contains + function f9(x) + end function f9 +end module m9 + +module m10 + type :: t10 + end type t10 + interface f10 + function f10() + end function f10 + end interface f10 +contains + !ERROR: 'f10' is already declared in this scoping unit + function f10(x) + end function f10 +end module m10 + +module m11 + type :: t11 + end type t11 + interface i11 + function f11() + end function f11 + end interface i11 +contains + !ERROR: 'f11' is already declared in this scoping unit + function f11(x) + end function f11 +end module m11 + +module m12 + interface f12 + function f12() + end function f12 + end interface f12 +contains + !ERROR: 'f12' is already declared in this scoping unit + function f12(x) + end function f12 +end module m12 + +module m13 + interface f13 + function f13() + end function f13 + end interface f13 +contains + !ERROR: 'f13' is already declared in this scoping unit + function f13() + end function f13 +end module m13