[flang-commits] [flang] [flang] Associate named constant actual arguments with their storage (PR #222986)
via flang-commits
flang-commits at lists.llvm.org
Tue Sep 22 08:47:40 PDT 2026
================
@@ -5930,7 +5936,46 @@ MaybeExpr ArgumentAnalyzer::AnalyzeExprOrWholeAssumedSizeArray(
}
}
auto restorer{context_.AllowNullPointer()};
- return context_.Analyze(expr);
+ MaybeExpr result{context_.Analyze(expr)};
+ // For actual arguments of procedure references, retain a designator whose
+ // base is a named constant in designator form instead of replacing it by
+ // its folded Constant value, so that lowering associates the dummy argument
+ // with the named constant's storage. This matters for sequence association
+ // of an array element actual argument (F'2023 15.5.2.12) and whenever the
+ // dummy's address is meaningful (e.g. OpenACC/OpenMP present checks).
+ // The inner Analyze calls below do not apply the outer folding performed
+ // by Analyze(parser::Expr), and folding still sees through the retained
+ // designator wherever a constant value is needed later.
+ if (isProcedureCall_ && result) {
+ // Look only at an expression that is itself a designator: a
+ // parenthesized designator is a primary, i.e. an expression
+ // (F'2023 R1001), and must keep its folded value. Substring actual
+ // arguments (the F'2023 15.5.2.12 p4 form of character sequence
+ // association) are not retained here and keep their folded values.
+ if (const auto *designator{
+ std::get_if<common::Indirection<parser::Designator>>(&expr.u)}) {
+ if (const auto *name{parser::Unwrap<parser::Name>(designator->value())}) {
+ // Whole named-constant array.
+ if (name->symbol &&
+ semantics::IsNamedConstant(name->symbol->GetUltimate()) &&
+ name->symbol->Rank() > 0) {
+ return context_.Analyze(*name);
+ }
+ } else if (result->Rank() == 0) {
+ // Named-constant array element (or array component of a scalar
+ // named constant of derived type), e.g. a(1) or pt%arr(1).
+ if (const auto *ae{
+ parser::Unwrap<parser::ArrayElement>(designator->value())}) {
+ const auto &baseName{parser::GetFirstName(ae->Base())};
+ if (baseName.symbol &&
+ semantics::IsNamedConstant(baseName.symbol->GetUltimate())) {
+ return context_.Analyze(*ae);
+ }
+ }
----------------
jeanPerier wrote:
Why only keeping a subset of the designators. I.e., it looks like it could still be beneficial to handle array sections (i.e, could the same acc declare issues occurs with array sections `param(1:10)`?).
https://github.com/llvm/llvm-project/pull/222986
More information about the flang-commits
mailing list