[flang-commits] [flang] f4215f7 - [flang] Fix handling of shadowed procedure name used as interface (#82837)
via flang-commits
flang-commits at lists.llvm.org
Fri Mar 1 16:42:04 PST 2024
Author: Peter Klausler
Date: 2024-03-01T16:42:00-08:00
New Revision: f4215f71402dccc9c6a6f7ad51bbc1d08c4a48c2
URL: https://github.com/llvm/llvm-project/commit/f4215f71402dccc9c6a6f7ad51bbc1d08c4a48c2
DIFF: https://github.com/llvm/llvm-project/commit/f4215f71402dccc9c6a6f7ad51bbc1d08c4a48c2.diff
LOG: [flang] Fix handling of shadowed procedure name used as interface (#82837)
Use BypassGeneric() to process the name of an interface in a procedure
declaration statement, so that if it's the name of a generic with a
homonymous specific procedure, that's what defines the interface.
Fixes https://github.com/llvm/llvm-project/issues/82267.
Added:
Modified:
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/bind-c03.f90
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 61d7ba5fc95c31..7fa9b0d8459c04 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5658,10 +5658,8 @@ void DeclarationVisitor::Post(const parser::ProcInterface &x) {
void DeclarationVisitor::Post(const parser::ProcDecl &x) {
const auto &name{std::get<parser::Name>(x.t)};
const Symbol *procInterface{nullptr};
- if (interfaceName_) {
- procInterface = interfaceName_->symbol->has<GenericDetails>()
- ? interfaceName_->symbol->get<GenericDetails>().specific()
- : interfaceName_->symbol;
+ if (interfaceName_ && interfaceName_->symbol) {
+ procInterface = &BypassGeneric(*interfaceName_->symbol);
}
auto attrs{HandleSaveName(name.source, GetAttrs())};
DerivedTypeDetails *dtDetails{nullptr};
diff --git a/flang/test/Semantics/bind-c03.f90 b/flang/test/Semantics/bind-c03.f90
index 03a544b1954d7c..65d52e964ca46e 100644
--- a/flang/test/Semantics/bind-c03.f90
+++ b/flang/test/Semantics/bind-c03.f90
@@ -13,7 +13,13 @@ subroutine proc2()
end
end interface
+ interface proc3
+ subroutine proc3() bind(c)
+ end
+ end interface
+
procedure(proc1), bind(c) :: pc1 ! no error
+ procedure(proc3), bind(c) :: pc4 ! no error
!ERROR: An interface name with BIND attribute must be specified if the BIND attribute is specified in a procedure declaration statement
procedure(proc2), bind(c) :: pc2
More information about the flang-commits
mailing list