forked from OSchip/llvm-project
[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:
parent
c1554f32e3
commit
cfc12a2120
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue