Skip to content

Commit d4e69ff

Browse files
klauslerchencha3
authored andcommitted
[flang] Fix crash on erroneous program (llvm#85615) (llvm#85659)
Replace a pointer that should never be null with a reference argument so that it's always defined. Fixes llvm#85615.
1 parent bf525c3 commit d4e69ff

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

flang/lib/Semantics/data-to-inits.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,17 @@ class DataInitializationCompiler {
118118
bool Scan(const parser::DataIDoObject &);
119119

120120
// 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 &);
122122
// 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 &);
124125
// If the returned flag is true, emit a warning about CHARACTER misusage.
125126
std::optional<std::pair<SomeExpr, bool>> ConvertElement(
126127
const SomeExpr &, const evaluate::DynamicType &);
127128

128129
DataInitializations &inits_;
129130
evaluate::ExpressionAnalyzer &exprAnalyzer_;
130131
ValueListIterator<DSV> values_;
131-
const Scope *scope_{nullptr};
132132
};
133133

134134
template <typename DSV>
@@ -149,8 +149,7 @@ bool DataInitializationCompiler<DSV>::Scan(const parser::Variable &var) {
149149
if (const auto *expr{GetExpr(exprAnalyzer_.context(), var)}) {
150150
parser::CharBlock at{var.GetSource()};
151151
exprAnalyzer_.GetFoldingContext().messages().SetLocation(at);
152-
scope_ = &exprAnalyzer_.context().FindScope(at);
153-
if (InitDesignator(*expr)) {
152+
if (InitDesignator(*expr, exprAnalyzer_.context().FindScope(at))) {
154153
return true;
155154
}
156155
}
@@ -170,8 +169,7 @@ bool DataInitializationCompiler<DSV>::Scan(
170169
if (expr) {
171170
parser::CharBlock at{parser::FindSourceLocation(designator)};
172171
exprAnalyzer_.GetFoldingContext().messages().SetLocation(at);
173-
scope_ = &exprAnalyzer_.context().FindScope(at);
174-
if (InitDesignator(*expr)) {
172+
if (InitDesignator(*expr, exprAnalyzer_.context().FindScope(at))) {
175173
return true;
176174
}
177175
}
@@ -254,12 +252,12 @@ template <typename DSV>
254252
bool DataInitializationCompiler<DSV>::Scan(const Symbol &symbol) {
255253
auto designator{exprAnalyzer_.Designate(evaluate::DataRef{symbol})};
256254
CHECK(designator.has_value());
257-
return InitDesignator(*designator);
255+
return InitDesignator(*designator, symbol.owner());
258256
}
259257

260258
template <typename DSV>
261259
bool DataInitializationCompiler<DSV>::InitDesignator(
262-
const SomeExpr &designator) {
260+
const SomeExpr &designator, const Scope &scope) {
263261
evaluate::FoldingContext &context{exprAnalyzer_.GetFoldingContext()};
264262
evaluate::DesignatorFolder folder{context};
265263
while (auto offsetSymbol{folder.FoldDesignator(designator)}) {
@@ -274,7 +272,7 @@ bool DataInitializationCompiler<DSV>::InitDesignator(
274272
designator.AsFortran());
275273
}
276274
return false;
277-
} else if (!InitElement(*offsetSymbol, designator)) {
275+
} else if (!InitElement(*offsetSymbol, designator, scope)) {
278276
return false;
279277
} else {
280278
++values_;
@@ -314,7 +312,8 @@ DataInitializationCompiler<DSV>::ConvertElement(
314312

315313
template <typename DSV>
316314
bool DataInitializationCompiler<DSV>::InitElement(
317-
const evaluate::OffsetSymbol &offsetSymbol, const SomeExpr &designator) {
315+
const evaluate::OffsetSymbol &offsetSymbol, const SomeExpr &designator,
316+
const Scope &scope) {
318317
const Symbol &symbol{offsetSymbol.symbol()};
319318
const Symbol *lastSymbol{GetLastSymbol(designator)};
320319
bool isPointer{lastSymbol && IsPointer(*lastSymbol)};
@@ -390,7 +389,7 @@ bool DataInitializationCompiler<DSV>::InitElement(
390389
} else if (isProcPointer) {
391390
if (evaluate::IsProcedure(*expr)) {
392391
if (CheckPointerAssignment(exprAnalyzer_.context(), designator, *expr,
393-
DEREF(scope_),
392+
scope,
394393
/*isBoundsRemapping=*/false, /*isAssumedRank=*/false)) {
395394
if (lastSymbol->has<ProcEntityDetails>()) {
396395
GetImage().AddPointer(offsetSymbol.offset(), *expr);
@@ -413,7 +412,7 @@ bool DataInitializationCompiler<DSV>::InitElement(
413412
"Procedure '%s' may not be used to initialize '%s', which is not a procedure pointer"_err_en_US,
414413
expr->AsFortran(), DescribeElement());
415414
} else if (CheckInitialDataPointerTarget(
416-
exprAnalyzer_.context(), designator, *expr, DEREF(scope_))) {
415+
exprAnalyzer_.context(), designator, *expr, scope)) {
417416
GetImage().AddPointer(offsetSymbol.offset(), *expr);
418417
return true;
419418
}

0 commit comments

Comments
 (0)