[flang] Correct the interpretation of BIND(C,NAME='')

An empty NAME= should mean that there is no C binding, not the
binding that would result from BIND(C) without a NAME=.
See 18.10.2p2.

Differential Revision: https://reviews.llvm.org/D100494
This commit is contained in:
peter klausler 2021-04-14 10:57:53 -07:00
parent c1554f32e3
commit cfc12a2120
1 changed files with 8 additions and 10 deletions

View File

@ -235,7 +235,7 @@ public:
Attrs GetAttrs();
Attrs EndAttrs();
bool SetPassNameOn(Symbol &);
bool SetBindNameOn(Symbol &);
void SetBindNameOn(Symbol &);
void Post(const parser::LanguageBindingSpec &);
bool Pre(const parser::IntentSpec &);
bool Pre(const parser::Pass &);
@ -1529,28 +1529,26 @@ bool AttrsVisitor::SetPassNameOn(Symbol &symbol) {
return true;
}
bool AttrsVisitor::SetBindNameOn(Symbol &symbol) {
void AttrsVisitor::SetBindNameOn(Symbol &symbol) {
if (!attrs_ || !attrs_->test(Attr::BIND_C)) {
return false;
return;
}
std::optional<std::string> label{evaluate::GetScalarConstantValue<
evaluate::Type<TypeCategory::Character, 1>>(bindName_)};
// 18.9.2(2): discard leading and trailing blanks, ignore if all blank
if (label) {
auto first{label->find_first_not_of(" ")};
auto last{label->find_last_not_of(" ")};
if (first == std::string::npos) {
// Empty NAME= means no binding at all (18.10.2p2)
Say(currStmtSource().value(), "Blank binding label ignored"_en_US);
label.reset();
} else {
label = label->substr(first, last - first + 1);
return;
}
}
if (!label) {
auto last{label->find_last_not_of(" ")};
label = label->substr(first, last - first + 1);
} else {
label = parser::ToLowerCaseLetters(symbol.name().ToString());
}
symbol.SetBindName(std::move(*label));
return true;
}
void AttrsVisitor::Post(const parser::LanguageBindingSpec &x) {