[PATCH] D86887: [flang] Improve compile-time shape conformance checking
Peter Klausler via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 31 12:21:42 PDT 2020
klausler created this revision.
klausler added reviewers: sscalpone, PeteSteinfeld.
klausler added a project: Flang.
Herald added a reviewer: jdoerfert.
Herald added a reviewer: DavidTruby.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
klausler requested review of this revision.
Conformance checking of the shapes of the operands of
array expressions can't, of course, always be done at
compilation time; but when the shapes are known and
nonconformable, we should catch the errors that we can.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D86887
Files:
flang/lib/Semantics/expression.cpp
flang/test/Semantics/select-rank.f90
Index: flang/test/Semantics/select-rank.f90
===================================================================
--- flang/test/Semantics/select-rank.f90
+++ flang/test/Semantics/select-rank.f90
@@ -211,8 +211,8 @@
END SELECT
- !ERROR: Selector 'arr(1:3)+ arr(4:5)' is not an assumed-rank array variable
- SELECT RANK(arr(1:3)+ arr(4:5))
+ !ERROR: Selector 'arr(1:2)+ arr(4:5)' is not an assumed-rank array variable
+ SELECT RANK(arr(1:2)+ arr(4:5))
END SELECT
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -129,6 +129,8 @@
bool IsIntrinsicNumeric(NumericOperator) const;
bool IsIntrinsicConcat() const;
+ bool CheckConformance() const;
+
// Find and return a user-defined operator or report an error.
// The provided message is used if there is no such operator.
MaybeExpr TryDefinedOp(
@@ -2267,6 +2269,7 @@
if (analyzer.fatalErrors()) {
return std::nullopt;
} else if (analyzer.IsIntrinsicNumeric(opr)) {
+ analyzer.CheckConformance();
return NumericOperation<OPR>(context.GetContextualMessages(),
analyzer.MoveExpr(0), analyzer.MoveExpr(1),
context.GetDefaultKind(TypeCategory::Real));
@@ -2819,6 +2822,23 @@
*GetType(0), GetRank(0), *GetType(1), GetRank(1));
}
+bool ArgumentAnalyzer::CheckConformance() const {
+ if (actuals_.size() == 2) {
+ const auto *lhs{actuals_.at(0).value().UnwrapExpr()};
+ const auto *rhs{actuals_.at(1).value().UnwrapExpr()};
+ if (lhs && rhs) {
+ auto &foldingContext{context_.GetFoldingContext()};
+ auto lhShape{GetShape(foldingContext, *lhs)};
+ auto rhShape{GetShape(foldingContext, *rhs)};
+ if (lhShape && rhShape) {
+ return evaluate::CheckConformance(foldingContext.messages(), *lhShape,
+ *rhShape, "left operand", "right operand");
+ }
+ }
+ }
+ return true; // no proven problem
+}
+
MaybeExpr ArgumentAnalyzer::TryDefinedOp(
const char *opr, parser::MessageFixedText &&error, bool isUserOp) {
if (AnyUntypedOperand()) {
@@ -2878,6 +2898,7 @@
proc = &symbol;
localActuals.at(passIndex).value().set_isPassedObject();
}
+ CheckConformance();
return context_.MakeFunctionRef(
source_, ProcedureDesignator{*proc}, std::move(localActuals));
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86887.289004.patch
Type: text/x-patch
Size: 2414 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200831/39fbf206/attachment.bin>
More information about the llvm-commits
mailing list