From 8f141490b996ba87323f75bf54b3d868efdaaf4a Mon Sep 17 00:00:00 2001 From: Peter Klausler <35819229+klausler@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:57:28 -0800 Subject: [flang] Fix separate MODULE PROCEDURE when binding label exists (#82686) When a separate module procedure is defined with a MODULE PROCEDURE and its corresponding interface has a binding label, the compiler was emitting an error about mismatching binding labels because the binding label wasn't being copied into the subprogram's definition. --- flang/lib/Semantics/resolve-names.cpp | 7 ++++++- flang/test/Semantics/separate-mp02.f90 | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 7de513d87..7f9909ee 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -4218,7 +4218,12 @@ bool SubprogramVisitor::BeginMpSubprogram(const parser::Name &name) { EraseSymbol(name); Symbol &newSymbol{MakeSymbol(name, SubprogramDetails{})}; PushScope(Scope::Kind::Subprogram, &newSymbol); - newSymbol.get().set_moduleInterface(*symbol); + auto &newSubprogram{newSymbol.get()}; + newSubprogram.set_moduleInterface(*symbol); + auto &subprogram{symbol->get()}; + if (const auto *name{subprogram.bindName()}) { + newSubprogram.set_bindName(std::string{*name}); + } newSymbol.attrs() |= symbol->attrs(); newSymbol.set(symbol->test(Symbol::Flag::Subroutine) ? Symbol::Flag::Subroutine diff --git a/flang/test/Semantics/separate-mp02.f90 b/flang/test/Semantics/separate-mp02.f90 index 5d13b6b..c63ab6f 100644 --- a/flang/test/Semantics/separate-mp02.f90 +++ b/flang/test/Semantics/separate-mp02.f90 @@ -148,6 +148,8 @@ module m2b end module subroutine s6() bind(c) end + module subroutine s7() bind(c, name="s7") + end end interface end @@ -172,6 +174,8 @@ contains !ERROR: Module subprogram 's6' has binding label 'not_s6' but the corresponding interface body has 's6' module subroutine s6() bind(c, name="not_s6") end + module procedure s7 + end end -- cgit v1.1