diff --git a/flang/lib/Semantics/data-to-inits.cpp b/flang/lib/Semantics/data-to-inits.cpp --- a/flang/lib/Semantics/data-to-inits.cpp +++ b/flang/lib/Semantics/data-to-inits.cpp @@ -43,7 +43,12 @@ bool hasFatalError() const { return hasFatalError_; } bool IsAtEnd() const { return at_ == end_; } const SomeExpr *operator*() const { return GetExpr(context_, GetConstant()); } - parser::CharBlock LocateSource() const { return GetConstant().source; } + std::optional LocateSource() const { + if (!hasFatalError_) { + return GetConstant().source; + } + return {}; + } ValueListIterator &operator++() { if (repetitionsRemaining_ > 0) { --repetitionsRemaining_; @@ -312,7 +317,9 @@ bool isPointer{lastSymbol && IsPointer(*lastSymbol)}; bool isProcPointer{lastSymbol && IsProcedurePointer(*lastSymbol)}; evaluate::FoldingContext &context{exprAnalyzer_.GetFoldingContext()}; - auto restorer{context.messages().SetLocation(values_.LocateSource())}; + auto &messages{context.messages()}; + auto restorer{ + messages.SetLocation(values_.LocateSource().value_or(messages.at()))}; const auto DescribeElement{[&]() { if (auto badDesignator{ diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -6562,9 +6562,10 @@ // work better. ultimate.set(Symbol::Flag::InDataStmt); }, - [&](const std::list> &) { + [&](const std::list> &values) { // Handled later in data-to-inits conversion ultimate.set(Symbol::Flag::InDataStmt); + Walk(values); }, }, init.u); diff --git a/flang/test/Semantics/resolve111.f90 b/flang/test/Semantics/resolve111.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/resolve111.f90 @@ -0,0 +1,7 @@ +!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s +!Resolve names in legacy data initializers +program name + implicit none + integer, parameter :: bar = 1 + integer foo(bar) /bar*2/ !CHECK: foo (InDataStmt) size=4 offset=4: ObjectEntity type: INTEGER(4) shape: 1_8:1_8 init:[INTEGER(4)::2_4] +end program name