[flang-commits] [flang] [flang] Fix crash on erroneous program (#85615) (PR #85659)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Mon Mar 18 09:32:15 PDT 2024
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/85659
Replace a pointer that should never be null with a reference argument so that it's always defined.
Fixes https://github.com/llvm/llvm-project/issues/85615.
>From 5ccf05d514ca3161144f60f6d8344b7bc53a8546 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Mon, 18 Mar 2024 09:29:21 -0700
Subject: [PATCH] [flang] Fix crash on erroneous program (#85615)
Replace a pointer that should never be null with a reference argument
so that it's always defined.
Fixes https://github.com/llvm/llvm-project/issues/85615.
---
flang/lib/Semantics/data-to-inits.cpp | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/flang/lib/Semantics/data-to-inits.cpp b/flang/lib/Semantics/data-to-inits.cpp
index fa22d498679053..2ebc4e561a339a 100644
--- a/flang/lib/Semantics/data-to-inits.cpp
+++ b/flang/lib/Semantics/data-to-inits.cpp
@@ -118,9 +118,10 @@ class DataInitializationCompiler {
bool Scan(const parser::DataIDoObject &);
// Initializes all elements of a designator, which can be an array or section.
- bool InitDesignator(const SomeExpr &);
+ bool InitDesignator(const SomeExpr &, const Scope &);
// Initializes a single scalar object.
- bool InitElement(const evaluate::OffsetSymbol &, const SomeExpr &designator);
+ bool InitElement(const evaluate::OffsetSymbol &, const SomeExpr &designator,
+ const Scope &);
// If the returned flag is true, emit a warning about CHARACTER misusage.
std::optional<std::pair<SomeExpr, bool>> ConvertElement(
const SomeExpr &, const evaluate::DynamicType &);
@@ -128,7 +129,6 @@ class DataInitializationCompiler {
DataInitializations &inits_;
evaluate::ExpressionAnalyzer &exprAnalyzer_;
ValueListIterator<DSV> values_;
- const Scope *scope_{nullptr};
};
template <typename DSV>
@@ -149,8 +149,7 @@ bool DataInitializationCompiler<DSV>::Scan(const parser::Variable &var) {
if (const auto *expr{GetExpr(exprAnalyzer_.context(), var)}) {
parser::CharBlock at{var.GetSource()};
exprAnalyzer_.GetFoldingContext().messages().SetLocation(at);
- scope_ = &exprAnalyzer_.context().FindScope(at);
- if (InitDesignator(*expr)) {
+ if (InitDesignator(*expr, exprAnalyzer_.context().FindScope(at))) {
return true;
}
}
@@ -170,8 +169,7 @@ bool DataInitializationCompiler<DSV>::Scan(
if (expr) {
parser::CharBlock at{parser::FindSourceLocation(designator)};
exprAnalyzer_.GetFoldingContext().messages().SetLocation(at);
- scope_ = &exprAnalyzer_.context().FindScope(at);
- if (InitDesignator(*expr)) {
+ if (InitDesignator(*expr, exprAnalyzer_.context().FindScope(at))) {
return true;
}
}
@@ -254,12 +252,12 @@ template <typename DSV>
bool DataInitializationCompiler<DSV>::Scan(const Symbol &symbol) {
auto designator{exprAnalyzer_.Designate(evaluate::DataRef{symbol})};
CHECK(designator.has_value());
- return InitDesignator(*designator);
+ return InitDesignator(*designator, symbol.owner());
}
template <typename DSV>
bool DataInitializationCompiler<DSV>::InitDesignator(
- const SomeExpr &designator) {
+ const SomeExpr &designator, const Scope &scope) {
evaluate::FoldingContext &context{exprAnalyzer_.GetFoldingContext()};
evaluate::DesignatorFolder folder{context};
while (auto offsetSymbol{folder.FoldDesignator(designator)}) {
@@ -274,7 +272,7 @@ bool DataInitializationCompiler<DSV>::InitDesignator(
designator.AsFortran());
}
return false;
- } else if (!InitElement(*offsetSymbol, designator)) {
+ } else if (!InitElement(*offsetSymbol, designator, scope)) {
return false;
} else {
++values_;
@@ -314,7 +312,8 @@ DataInitializationCompiler<DSV>::ConvertElement(
template <typename DSV>
bool DataInitializationCompiler<DSV>::InitElement(
- const evaluate::OffsetSymbol &offsetSymbol, const SomeExpr &designator) {
+ const evaluate::OffsetSymbol &offsetSymbol, const SomeExpr &designator,
+ const Scope &scope) {
const Symbol &symbol{offsetSymbol.symbol()};
const Symbol *lastSymbol{GetLastSymbol(designator)};
bool isPointer{lastSymbol && IsPointer(*lastSymbol)};
@@ -390,7 +389,7 @@ bool DataInitializationCompiler<DSV>::InitElement(
} else if (isProcPointer) {
if (evaluate::IsProcedure(*expr)) {
if (CheckPointerAssignment(exprAnalyzer_.context(), designator, *expr,
- DEREF(scope_),
+ scope,
/*isBoundsRemapping=*/false, /*isAssumedRank=*/false)) {
if (lastSymbol->has<ProcEntityDetails>()) {
GetImage().AddPointer(offsetSymbol.offset(), *expr);
@@ -413,7 +412,7 @@ bool DataInitializationCompiler<DSV>::InitElement(
"Procedure '%s' may not be used to initialize '%s', which is not a procedure pointer"_err_en_US,
expr->AsFortran(), DescribeElement());
} else if (CheckInitialDataPointerTarget(
- exprAnalyzer_.context(), designator, *expr, DEREF(scope_))) {
+ exprAnalyzer_.context(), designator, *expr, scope)) {
GetImage().AddPointer(offsetSymbol.offset(), *expr);
return true;
}
More information about the flang-commits
mailing list