diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h index 4535a92ce3dd8e..0577cba9587d55 100644 --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -786,6 +786,9 @@ class Symbol { inline Symbol &GetUltimate(); inline const Symbol &GetUltimate() const; + // Get the specific procedure from a potential generic symbol. + inline const Symbol *GetUltimateGeneric() const; + inline DeclTypeSpec *GetType(); inline const DeclTypeSpec *GetType() const; void SetType(const DeclTypeSpec &); @@ -985,6 +988,16 @@ inline const Symbol &Symbol::GetUltimate() const { } } +inline const Symbol *Symbol::GetUltimateGeneric() const { + if (this->has()) + return this; + if (const auto *details{detailsIf()}) + return details->symbol().GetUltimateGeneric(); + if (const auto *details{detailsIf()}) + return details->symbol().GetUltimateGeneric(); + return nullptr; +} + inline DeclTypeSpec *Symbol::GetType() { return const_cast( const_cast(this)->GetType()); diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 36deab969456d0..0e21f3dabb6a01 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -5644,12 +5644,14 @@ void DeclarationVisitor::Post(const parser::ProcInterface &x) { NoteInterfaceName(*name); } } + void DeclarationVisitor::Post(const parser::ProcDecl &x) { const auto &name{std::get(x.t)}; const Symbol *procInterface{nullptr}; if (interfaceName_) { - procInterface = interfaceName_->symbol->has() - ? interfaceName_->symbol->get().specific() + const Symbol *ultimateGeneric{interfaceName_->symbol->GetUltimateGeneric()}; + procInterface = ultimateGeneric + ? ultimateGeneric->get().specific() : interfaceName_->symbol; } auto attrs{HandleSaveName(name.source, GetAttrs())};