aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Semantics/expression.cpp')
-rw-r--r--flang/lib/Semantics/expression.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index c2eb17c..3ec6f38 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -1506,9 +1506,9 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::CoindexedNamedObject &x) {
if (cosubsOk && !reversed.empty()) {
int numCosubscripts{static_cast<int>(cosubscripts.size())};
const Symbol &symbol{reversed.front()};
- if (numCosubscripts != symbol.Corank()) {
+ if (numCosubscripts != GetCorank(symbol)) {
Say("'%s' has corank %d, but coindexed reference has %d cosubscripts"_err_en_US,
- symbol.name(), symbol.Corank(), numCosubscripts);
+ symbol.name(), GetCorank(symbol), numCosubscripts);
}
}
for (const auto &imageSelSpec :
@@ -2536,6 +2536,15 @@ static bool CheckCompatibleArgument(bool isElemental,
return false;
},
[&](const characteristics::DummyProcedure &dummy) {
+ if ((dummy.attrs.test(
+ characteristics::DummyProcedure::Attr::Optional) ||
+ dummy.attrs.test(
+ characteristics::DummyProcedure::Attr::Pointer)) &&
+ IsBareNullPointer(expr)) {
+ // NULL() is compatible with any dummy pointer
+ // or optional dummy procedure.
+ return true;
+ }
if (!expr || !IsProcedurePointerTarget(*expr)) {
return false;
}