[flang-commits] [flang] c3def59 - [flang] Fix bogus error about duplicate binding names (#89786)
via flang-commits
flang-commits at lists.llvm.org
Wed Apr 24 14:57:04 PDT 2024
Author: Peter Klausler
Date: 2024-04-24T14:57:00-07:00
New Revision: c3def59d0f28edf32eb43236db88f21321f36dca
URL: https://github.com/llvm/llvm-project/commit/c3def59d0f28edf32eb43236db88f21321f36dca
DIFF: https://github.com/llvm/llvm-project/commit/c3def59d0f28edf32eb43236db88f21321f36dca.diff
LOG: [flang] Fix bogus error about duplicate binding names (#89786)
Don't call SetBindNameOn() from DeclareUnknownEntity() unless there is
an explicit BIND(C) attribute.
Fixes https://github.com/llvm/llvm-project/issues/89439 and
https://github.com/llvm/llvm-project/issues/89558.
Added:
Modified:
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/declarations03.f90
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index b941f257a95ea3..c21cf1bf4d7da3 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1779,7 +1779,6 @@ void AttrsVisitor::SetBindNameOn(Symbol &symbol) {
!symbol.attrs().test(Attr::BIND_C)) {
return;
}
-
std::optional<std::string> label{
evaluate::GetScalarConstantValue<evaluate::Ascii>(bindName_)};
// 18.9.2(2): discard leading and trailing blanks
@@ -1798,16 +1797,18 @@ void AttrsVisitor::SetBindNameOn(Symbol &symbol) {
} else {
label = symbol.name().ToString();
}
- // Check if a symbol has two Bind names.
+ // Checks whether a symbol has two Bind names.
std::string oldBindName;
- if (symbol.GetBindName()) {
- oldBindName = *symbol.GetBindName();
+ if (const auto *bindName{symbol.GetBindName()}) {
+ oldBindName = *bindName;
}
symbol.SetBindName(std::move(*label));
if (!oldBindName.empty()) {
if (const std::string * newBindName{symbol.GetBindName()}) {
if (oldBindName != *newBindName) {
- Say(symbol.name(), "The entity '%s' has multiple BIND names"_err_en_US);
+ Say(symbol.name(),
+ "The entity '%s' has multiple BIND names ('%s' and '%s')"_err_en_US,
+ symbol.name(), oldBindName, *newBindName);
}
}
}
@@ -4986,7 +4987,9 @@ Symbol &DeclarationVisitor::DeclareUnknownEntity(
if (symbol.attrs().test(Attr::EXTERNAL)) {
ConvertToProcEntity(symbol);
}
- SetBindNameOn(symbol);
+ if (attrs.test(Attr::BIND_C)) {
+ SetBindNameOn(symbol);
+ }
return symbol;
}
}
diff --git a/flang/test/Semantics/declarations03.f90 b/flang/test/Semantics/declarations03.f90
index 3459b2287b2bad..65b07e7d5c6567 100644
--- a/flang/test/Semantics/declarations03.f90
+++ b/flang/test/Semantics/declarations03.f90
@@ -19,7 +19,7 @@ module m
common /blk4/ w
bind(c, name="cc") :: t2, /blk4/
- !ERROR: The entity 'blk5' has multiple BIND names
+ !ERROR: The entity 'blk5' has multiple BIND names ('dd' and 'ee')
common /blk5/ i
bind(c, name="dd") :: /blk5/
bind(c, name="ee") :: /blk5/
@@ -29,7 +29,7 @@ module m
bind(c, name="ff") :: /blk6/
bind(c, name="ff") :: /blk7/
- !ERROR: The entity 's1' has multiple BIND names
+ !ERROR: The entity 's1' has multiple BIND names ('gg' and 'hh')
integer :: s1
bind(c, name="gg") :: s1
!ERROR: BIND_C attribute was already specified on 's1'
@@ -40,12 +40,12 @@ module m
bind(c, name="ii") :: s2
bind(c, name="ii") :: s3
- !ERROR: The entity 's4' has multiple BIND names
+ !ERROR: The entity 's4' has multiple BIND names ('ss1' and 'jj')
integer, bind(c, name="ss1") :: s4
!ERROR: BIND_C attribute was already specified on 's4'
bind(c, name="jj") :: s4
- !ERROR: The entity 's5' has multiple BIND names
+ !ERROR: The entity 's5' has multiple BIND names ('kk' and 'ss2')
bind(c, name="kk") :: s5
!ERROR: BIND_C attribute was already specified on 's5'
integer, bind(c, name="ss2") :: s5
@@ -72,3 +72,8 @@ module b
!ERROR: Two entities have the same global name 'int'
integer, bind(c, name="int") :: i
end module
+
+module c
+ bind(c, name = "AAA") a
+ integer aaa ! ensure no bogus error about multiple binding names
+end module
More information about the flang-commits
mailing list