Skip to content

[flang] Fix crash on erroneous program (#85615) #85659

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 18, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions flang/lib/Semantics/data-to-inits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,17 +118,17 @@ 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 &);

DataInitializations &inits_;
evaluate::ExpressionAnalyzer &exprAnalyzer_;
ValueListIterator<DSV> values_;
const Scope *scope_{nullptr};
};

template <typename DSV>
Expand All @@ -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;
}
}
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -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)}) {
Expand All @@ -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_;
Expand Down Expand Up @@ -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)};
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down