@@ -118,17 +118,17 @@ class DataInitializationCompiler {
118
118
bool Scan (const parser::DataIDoObject &);
119
119
120
120
// Initializes all elements of a designator, which can be an array or section.
121
- bool InitDesignator (const SomeExpr &);
121
+ bool InitDesignator (const SomeExpr &, const Scope & );
122
122
// Initializes a single scalar object.
123
- bool InitElement (const evaluate::OffsetSymbol &, const SomeExpr &designator);
123
+ bool InitElement (const evaluate::OffsetSymbol &, const SomeExpr &designator,
124
+ const Scope &);
124
125
// If the returned flag is true, emit a warning about CHARACTER misusage.
125
126
std::optional<std::pair<SomeExpr, bool >> ConvertElement (
126
127
const SomeExpr &, const evaluate::DynamicType &);
127
128
128
129
DataInitializations &inits_;
129
130
evaluate::ExpressionAnalyzer &exprAnalyzer_;
130
131
ValueListIterator<DSV> values_;
131
- const Scope *scope_{nullptr };
132
132
};
133
133
134
134
template <typename DSV>
@@ -149,8 +149,7 @@ bool DataInitializationCompiler<DSV>::Scan(const parser::Variable &var) {
149
149
if (const auto *expr{GetExpr (exprAnalyzer_.context (), var)}) {
150
150
parser::CharBlock at{var.GetSource ()};
151
151
exprAnalyzer_.GetFoldingContext ().messages ().SetLocation (at);
152
- scope_ = &exprAnalyzer_.context ().FindScope (at);
153
- if (InitDesignator (*expr)) {
152
+ if (InitDesignator (*expr, exprAnalyzer_.context ().FindScope (at))) {
154
153
return true ;
155
154
}
156
155
}
@@ -170,8 +169,7 @@ bool DataInitializationCompiler<DSV>::Scan(
170
169
if (expr) {
171
170
parser::CharBlock at{parser::FindSourceLocation (designator)};
172
171
exprAnalyzer_.GetFoldingContext ().messages ().SetLocation (at);
173
- scope_ = &exprAnalyzer_.context ().FindScope (at);
174
- if (InitDesignator (*expr)) {
172
+ if (InitDesignator (*expr, exprAnalyzer_.context ().FindScope (at))) {
175
173
return true ;
176
174
}
177
175
}
@@ -254,12 +252,12 @@ template <typename DSV>
254
252
bool DataInitializationCompiler<DSV>::Scan(const Symbol &symbol) {
255
253
auto designator{exprAnalyzer_.Designate (evaluate::DataRef{symbol})};
256
254
CHECK (designator.has_value ());
257
- return InitDesignator (*designator);
255
+ return InitDesignator (*designator, symbol. owner () );
258
256
}
259
257
260
258
template <typename DSV>
261
259
bool DataInitializationCompiler<DSV>::InitDesignator(
262
- const SomeExpr &designator) {
260
+ const SomeExpr &designator, const Scope &scope ) {
263
261
evaluate::FoldingContext &context{exprAnalyzer_.GetFoldingContext ()};
264
262
evaluate::DesignatorFolder folder{context};
265
263
while (auto offsetSymbol{folder.FoldDesignator (designator)}) {
@@ -274,7 +272,7 @@ bool DataInitializationCompiler<DSV>::InitDesignator(
274
272
designator.AsFortran ());
275
273
}
276
274
return false ;
277
- } else if (!InitElement (*offsetSymbol, designator)) {
275
+ } else if (!InitElement (*offsetSymbol, designator, scope )) {
278
276
return false ;
279
277
} else {
280
278
++values_;
@@ -314,7 +312,8 @@ DataInitializationCompiler<DSV>::ConvertElement(
314
312
315
313
template <typename DSV>
316
314
bool DataInitializationCompiler<DSV>::InitElement(
317
- const evaluate::OffsetSymbol &offsetSymbol, const SomeExpr &designator) {
315
+ const evaluate::OffsetSymbol &offsetSymbol, const SomeExpr &designator,
316
+ const Scope &scope) {
318
317
const Symbol &symbol{offsetSymbol.symbol ()};
319
318
const Symbol *lastSymbol{GetLastSymbol (designator)};
320
319
bool isPointer{lastSymbol && IsPointer (*lastSymbol)};
@@ -390,7 +389,7 @@ bool DataInitializationCompiler<DSV>::InitElement(
390
389
} else if (isProcPointer) {
391
390
if (evaluate::IsProcedure (*expr)) {
392
391
if (CheckPointerAssignment (exprAnalyzer_.context (), designator, *expr,
393
- DEREF (scope_) ,
392
+ scope ,
394
393
/* isBoundsRemapping=*/ false , /* isAssumedRank=*/ false )) {
395
394
if (lastSymbol->has <ProcEntityDetails>()) {
396
395
GetImage ().AddPointer (offsetSymbol.offset (), *expr);
@@ -413,7 +412,7 @@ bool DataInitializationCompiler<DSV>::InitElement(
413
412
" Procedure '%s' may not be used to initialize '%s', which is not a procedure pointer" _err_en_US,
414
413
expr->AsFortran (), DescribeElement ());
415
414
} else if (CheckInitialDataPointerTarget (
416
- exprAnalyzer_.context (), designator, *expr, DEREF (scope_) )) {
415
+ exprAnalyzer_.context (), designator, *expr, scope )) {
417
416
GetImage ().AddPointer (offsetSymbol.offset (), *expr);
418
417
return true ;
419
418
}
0 commit comments