[flang] Respect !DIR$ IGNORE_TKR in generic matching
authorPeter Klausler <pklausler@nvidia.com>
Wed, 17 May 2023 18:19:14 +0000 (11:19 -0700)
committerPeter Klausler <pklausler@nvidia.com>
Thu, 18 May 2023 18:26:16 +0000 (11:26 -0700)
Generic matching needs to relax argument compatibility checks when
dummy arguments have !DIR$ IGNORE_TKR directives.

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

flang/lib/Evaluate/characteristics.cpp
flang/lib/Semantics/expression.cpp
flang/lib/Semantics/symbol.cpp
flang/test/Semantics/ignore_tkr02.f90 [new file with mode: 0644]

index 62b1573..6b961ac 100644 (file)
@@ -400,6 +400,9 @@ llvm::raw_ostream &DummyDataObject::Dump(llvm::raw_ostream &o) const {
       sep = ',';
     }
   }
+  if (!ignoreTKR.empty()) {
+    ignoreTKR.Dump(o << ' ', common::EnumToString);
+  }
   return o;
 }
 
index afd9267..9e95411 100644 (file)
@@ -2307,10 +2307,11 @@ static bool CheckCompatibleArgument(bool isElemental,
               return true;
             } else if (!isElemental && actual.Rank() != x.type.Rank() &&
                 !x.type.attrs().test(
-                    characteristics::TypeAndShape::Attr::AssumedRank)) {
+                    characteristics::TypeAndShape::Attr::AssumedRank) &&
+                !x.ignoreTKR.test(common::IgnoreTKR::Rank)) {
               return false;
             } else if (auto actualType{actual.GetType()}) {
-              return x.type.type().IsTkCompatibleWith(*actualType);
+              return x.type.type().IsTkCompatibleWith(*actualType, x.ignoreTKR);
             }
             return false;
           },
index 83d73f2..d9fd0d0 100644 (file)
@@ -411,8 +411,7 @@ llvm::raw_ostream &operator<<(
     os << " (has unanalyzedPDTComponentInit)";
   }
   if (!x.ignoreTKR_.empty()) {
-    os << ' ';
-    x.ignoreTKR_.Dump(os, common::EnumToString);
+    x.ignoreTKR_.Dump(os << ' ', common::EnumToString);
   }
   return os;
 }
diff --git a/flang/test/Semantics/ignore_tkr02.f90 b/flang/test/Semantics/ignore_tkr02.f90
new file mode 100644 (file)
index 0000000..a56b92d
--- /dev/null
@@ -0,0 +1,38 @@
+! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
+program main
+  interface generic
+    subroutine sub1(j, k)
+      integer(1) j
+      integer k
+      !dir$ ignore_tkr(kr) k
+    end
+    subroutine sub2(j, k)
+      integer(2) j
+      integer k
+      !dir$ ignore_tkr(kr) k
+    end
+    subroutine sub4(j, k)
+      integer(4) j
+      integer k
+      !dir$ ignore_tkr(kr) k
+    end
+  end interface
+!CHECK: CALL sub1(1_1,int(1_1,kind=4))
+  call generic(1_1,1_1)
+!CHECK: CALL sub1(1_1,int(1_2,kind=4))
+  call generic(1_1,1_2)
+!CHECK: CALL sub1(1_1,[INTEGER(1)::1_1])
+  call generic(1_1,[1_1])
+!CHECK: CALL sub2(1_2,int(1_1,kind=4))
+  call generic(1_2,1_1)
+!CHECK: CALL sub2(1_2,int(1_2,kind=4))
+  call generic(1_2,1_2)
+!CHECK: CALL sub2(1_2,[INTEGER(1)::1_1])
+  call generic(1_2,[1_1])
+!CHECK: CALL sub4(1_4,int(1_1,kind=4))
+  call generic(1_4,1_1)
+!CHECK: CALL sub4(1_4,int(1_2,kind=4))
+  call generic(1_4,1_2)
+!CHECK: CALL sub4(1_4,[INTEGER(1)::1_1])
+  call generic(1_4,[1_1])
+end