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,10 @@ 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 @@ -6564,9 +6564,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,8 @@ +! RUN: %python %S/test_errors.py %s %flang_fc1 +! Resolve names in legacy data initializers +program name + implicit none + integer, parameter :: bar = 1 + integer foo(bar) /bar*2/ +end program name + \ No newline at end of file