[flang-commits] [flang] df6de22 - [flang] Fix INQUIRE of access and formatting possibilities

peter klausler via flang-commits flang-commits at lists.llvm.org
Thu Oct 1 10:28:08 PDT 2020


Author: peter klausler
Date: 2020-10-01T10:27:20-07:00
New Revision: df6de2222c66c5a1c62da0b10c35de432ddc270a

URL: https://github.com/llvm/llvm-project/commit/df6de2222c66c5a1c62da0b10c35de432ddc270a
DIFF: https://github.com/llvm/llvm-project/commit/df6de2222c66c5a1c62da0b10c35de432ddc270a.diff

LOG: [flang] Fix INQUIRE of access and formatting possibilities

Don't give false positives from INQUIRE about possible
access mode changes on connected units.  DIRECT and SEQUENTIAL
cannot be intermixed, apart from allowing DIRECT on a SEQUENTIAL
file with fixed-size records and positioning.  Nor can
FORMATTED and UNFORMATTED be interchanged.  On unconnected
files, the best that we can do is "UNKNOWN".

Differential revision: https://reviews.llvm.org/D88673

Added: 
    

Modified: 
    flang/runtime/io-stmt.cpp

Removed: 
    


################################################################################
diff  --git a/flang/runtime/io-stmt.cpp b/flang/runtime/io-stmt.cpp
index 2a7d552dacd8..45b5f2a95060 100644
--- a/flang/runtime/io-stmt.cpp
+++ b/flang/runtime/io-stmt.cpp
@@ -820,7 +820,10 @@ bool InquireUnitState::Inquire(
     }
     break;
   case HashInquiryKeyword("DIRECT"):
-    str = unit().mayPosition() ? "YES" : "NO";
+    str = unit().access == Access::Direct ||
+            (unit().mayPosition() && unit().isFixedRecordLength)
+        ? "YES"
+        : "NO";
     break;
   case HashInquiryKeyword("ENCODING"):
     str = unit().isUnformatted ? "UNDEFINED"
@@ -831,7 +834,7 @@ bool InquireUnitState::Inquire(
     str = unit().isUnformatted ? "UNFORMATTED" : "FORMATTED";
     break;
   case HashInquiryKeyword("FORMATTED"):
-    str = "YES";
+    str = !unit().isUnformatted ? "YES" : "NO";
     break;
   case HashInquiryKeyword("NAME"):
     str = unit().path();
@@ -887,7 +890,9 @@ bool InquireUnitState::Inquire(
     }
     break;
   case HashInquiryKeyword("SEQUENTIAL"):
-    str = "YES";
+    // "NO" for Direct, since Sequential would not work if
+    // the unit were reopened without RECL=.
+    str = unit().access == Access::Sequential ? "YES" : "NO";
     break;
   case HashInquiryKeyword("SIGN"):
     str = unit().isUnformatted                 ? "UNDEFINED"
@@ -895,13 +900,13 @@ bool InquireUnitState::Inquire(
                                                : "SUPPRESS";
     break;
   case HashInquiryKeyword("STREAM"):
-    str = "YES";
+    str = unit().access == Access::Stream ? "YES" : "NO";
     break;
   case HashInquiryKeyword("WRITE"):
     str = unit().mayWrite() ? "YES" : "NO";
     break;
   case HashInquiryKeyword("UNFORMATTED"):
-    str = "YES";
+    str = unit().isUnformatted ? "YES" : "NO";
     break;
   }
   if (str) {
@@ -1090,6 +1095,10 @@ bool InquireUnconnectedFileState::Inquire(
     break;
   case HashInquiryKeyword("DIRECT"):
   case HashInquiryKeyword("ENCODING"):
+  case HashInquiryKeyword("FORMATTED"):
+  case HashInquiryKeyword("SEQUENTIAL"):
+  case HashInquiryKeyword("STREAM"):
+  case HashInquiryKeyword("UNFORMATTED"):
     str = "UNKNONN";
     break;
   case HashInquiryKeyword("READ"):
@@ -1101,12 +1110,6 @@ bool InquireUnconnectedFileState::Inquire(
   case HashInquiryKeyword("WRITE"):
     str = MayWrite(path_.get()) ? "YES" : "NO";
     break;
-  case HashInquiryKeyword("FORMATTED"):
-  case HashInquiryKeyword("SEQUENTIAL"):
-  case HashInquiryKeyword("STREAM"):
-  case HashInquiryKeyword("UNFORMATTED"):
-    str = "YES";
-    break;
   case HashInquiryKeyword("NAME"):
     str = path_.get();
     return true;


        


More information about the flang-commits mailing list