[flang-commits] [PATCH] D90499: [flang] Plug error recovery hole for erroneous subscripts
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Fri Oct 30 14:20:19 PDT 2020
klausler created this revision.
klausler added a reviewer: tskeith.
klausler added a project: Flang.
Herald added subscribers: llvm-commits, jdoerfert.
Herald added a project: LLVM.
klausler requested review of this revision.
Avoid a crash in folding an empty vector of subscripts
that resulted from a semantic error.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D90499
Files:
flang/lib/Semantics/expression.cpp
flang/test/Semantics/expr-errors03.f90
Index: flang/test/Semantics/expr-errors03.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/expr-errors03.f90
@@ -0,0 +1,20 @@
+! RUN: %S/test_errors.sh %s %t %f18
+! Regression test for subscript error recovery
+module m
+ implicit none
+ integer, parameter :: n = 3
+ integer, parameter :: pc(n) = [0, 5, 6]
+ contains
+ logical function f(u)
+ integer :: u
+ !ERROR: No explicit type declared for 'i'
+ do i = 1, n
+ !ERROR: No explicit type declared for 'i'
+ if (pc(i) == u) then
+ f = .true.
+ return
+ end if
+ end do
+ f = .false.
+ end
+end module
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -205,11 +205,10 @@
// subscripts are in hand.
MaybeExpr ExpressionAnalyzer::CompleteSubscripts(ArrayRef &&ref) {
const Symbol &symbol{ref.GetLastSymbol().GetUltimate()};
- const auto *object{symbol.detailsIf<semantics::ObjectEntityDetails>()};
int symbolRank{symbol.Rank()};
int subscripts{static_cast<int>(ref.size())};
if (subscripts == 0) {
- // nothing to check
+ return std::nullopt; // error recovery
} else if (subscripts != symbolRank) {
if (symbolRank != 0) {
Say("Reference to rank-%d object '%s' has %d subscripts"_err_en_US,
@@ -230,7 +229,8 @@
return std::nullopt;
}
}
- } else if (object) {
+ } else if (const auto *object{
+ symbol.detailsIf<semantics::ObjectEntityDetails>()}) {
// C928 & C1002
if (Triplet * last{std::get_if<Triplet>(&ref.subscript().back().u)}) {
if (!last->upper() && object->IsAssumedSize()) {
@@ -240,6 +240,11 @@
return std::nullopt;
}
}
+ } else {
+ // Shouldn't get here from Analyze(ArrayElement) without a valid base,
+ // which, if not an object, must be a construct entity from
+ // SELECT TYPE/RANK or ASSOCIATE.
+ CHECK(symbol.has<semantics::AssocEntityDetails>());
}
return Designate(DataRef{std::move(ref)});
}
@@ -247,6 +252,9 @@
// Applies subscripts to a data reference.
MaybeExpr ExpressionAnalyzer::ApplySubscripts(
DataRef &&dataRef, std::vector<Subscript> &&subscripts) {
+ if (subscripts.empty()) {
+ return std::nullopt; // error recovery
+ }
return std::visit(
common::visitors{
[&](SymbolRef &&symbol) {
@@ -902,7 +910,6 @@
if (baseExpr) {
if (ae.subscripts.empty()) {
// will be converted to function call later or error reported
- return std::nullopt;
} else if (baseExpr->Rank() == 0) {
if (const Symbol * symbol{GetLastSymbol(*baseExpr)}) {
if (!context_.HasError(symbol)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D90499.302017.patch
Type: text/x-patch
Size: 2804 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20201030/f2aabf4d/attachment.bin>
More information about the flang-commits
mailing list