[flang] CHARACTER(*) return does not require explicit interface
authorJean Perier <jperier@nvidia.com>
Wed, 23 Sep 2020 11:38:10 +0000 (13:38 +0200)
committerJean Perier <jperier@nvidia.com>
Wed, 23 Sep 2020 11:38:10 +0000 (13:38 +0200)
Fortran 2018 15.4.2.2(4)(c) says nonassumed or explicit non-constant
length parameter require explicit interface. The "nonassumed" part was
missing in f18 characteristic analysis causing CanBeCalledViaImplicitInterface
to return false for `CHARACTER(*) function foo()` like interfaces.

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D88075

flang/lib/Evaluate/characteristics.cpp

index 9d301b6..de01336 100644 (file)
@@ -485,6 +485,8 @@ bool FunctionResult::CanBeReturnedViaImplicitInterface() const {
         if (const auto *param{type.charLength()}) {
           if (const auto &expr{param->GetExplicit()}) {
             return IsConstantExpr(*expr); // 15.4.2.2(4)(c)
+          } else if (param->isAssumed()) {
+            return true;
           }
         }
         return false;