[flang] If it's got an argument keyword, it can't become an array reference
authorPeter Klausler <pklausler@nvidia.com>
Tue, 10 Jan 2023 21:26:39 +0000 (13:26 -0800)
committerPeter Klausler <pklausler@nvidia.com>
Sun, 29 Jan 2023 16:40:46 +0000 (08:40 -0800)
Array references like A(1) are commonly misparsed as function references,
since the parser has almost no semantic context, and the parse tree is
fixed up later by semantics once it can be disambiguated.  In a case
like A(I=1), however, the presence of an argument keyword must prevent
conversion into an array reference.  (It might still also be a structure
constructor.)

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

flang/lib/Semantics/expression.cpp
flang/test/Semantics/call32.f90 [new file with mode: 0644]

index 6099ec4..966884f 100644 (file)
@@ -3247,6 +3247,13 @@ static void FixMisparsedFunctionReference(
   if (auto *func{
           std::get_if<common::Indirection<parser::FunctionReference>>(&u)}) {
     parser::FunctionReference &funcRef{func->value()};
+    // Ensure that there are no argument keywords
+    for (const auto &arg :
+        std::get<std::list<parser::ActualArgSpec>>(funcRef.v.t)) {
+      if (std::get<std::optional<parser::Keyword>>(arg.t)) {
+        return;
+      }
+    }
     auto &proc{std::get<parser::ProcedureDesignator>(funcRef.v.t)};
     if (Symbol *origSymbol{
             common::visit(common::visitors{
diff --git a/flang/test/Semantics/call32.f90 b/flang/test/Semantics/call32.f90
new file mode 100644 (file)
index 0000000..80e9c02
--- /dev/null
@@ -0,0 +1,8 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1 -Werror
+! Ensure that a seemingly misparsed function reference is
+! not converted to an array references of the same name if
+! there's an argument keyword.
+real array(1)
+!ERROR: 'array' is not a callable procedure
+print *, array(argument=1)
+end