mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[flang] preserve symbol in DescriptorInquiry
Do not use ultimate symbols in DescriptorInquiry. Using the ultimate symbol may lead to issues later for at least two reasons: - The original symbols may have volatile/asynchronous attributes that the ultimate may not have. Later phases working on the DescriptorInquiry would then not apply potential care required by these attributes. - HostAssociatedDetails symbols are used by OpenMP for symbols with special OpenMP attributes inside OpenMP region (e.g variables with private attribute), so it is very important to preserve this aspect in the DescriptorInquiry, that would otherwise apply on the symbol outside of the region. Differential Revision: https://reviews.llvm.org/D104385
This commit is contained in:
@@ -514,16 +514,10 @@ auto GetShapeHelper::operator()(const Symbol &symbol) const -> Result {
|
||||
[&](const semantics::ProcBindingDetails &binding) {
|
||||
return (*this)(binding.symbol());
|
||||
},
|
||||
[&](const semantics::UseDetails &use) {
|
||||
return (*this)(use.symbol());
|
||||
},
|
||||
[&](const semantics::HostAssocDetails &assoc) {
|
||||
return (*this)(assoc.symbol());
|
||||
},
|
||||
[](const semantics::TypeParamDetails &) { return ScalarShape(); },
|
||||
[](const auto &) { return Result{}; },
|
||||
},
|
||||
symbol.details());
|
||||
symbol.GetUltimate().details());
|
||||
}
|
||||
|
||||
auto GetShapeHelper::operator()(const Component &component) const -> Result {
|
||||
|
||||
@@ -269,7 +269,7 @@ static std::optional<Expr<SubscriptInteger>> SymbolLEN(const Symbol &symbol) {
|
||||
return len;
|
||||
} else if (IsDescriptor(ultimate) && !ultimate.owner().IsDerivedType()) {
|
||||
return Expr<SubscriptInteger>{DescriptorInquiry{
|
||||
NamedEntity{ultimate}, DescriptorInquiry::Field::Len}};
|
||||
NamedEntity{symbol}, DescriptorInquiry::Field::Len}};
|
||||
}
|
||||
}
|
||||
return std::nullopt;
|
||||
|
||||
Reference in New Issue
Block a user