[flang-commits] [flang] 1db42fa - [flang] Do not write implicit SAVE attribute into the mod file. (#67215)

via flang-commits flang-commits at lists.llvm.org
Mon Sep 25 09:35:47 PDT 2023


Author: Slava Zakharin
Date: 2023-09-25T09:35:43-07:00
New Revision: 1db42fa6f07838365e34d7d05df3c8b7287be176

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

LOG: [flang] Do not write implicit SAVE attribute into the mod file. (#67215)

If it happens that a symbol has an implicit SAVE attribute,
we have to omit it in the mod file writer. Otherwise it may
violate F202X C862:
The SAVE attribute shall not be specified for... an object that is
in a common block.

Added: 
    flang/test/Semantics/modfile58.f90

Modified: 
    flang/lib/Semantics/mod-file.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp
index 15d6f62f706c922..cee267a894ffde1 100644
--- a/flang/lib/Semantics/mod-file.cpp
+++ b/flang/lib/Semantics/mod-file.cpp
@@ -244,6 +244,14 @@ bool ModFileWriter::PutComponents(const Symbol &typeSymbol) {
   }
 }
 
+// Return the symbol's attributes that should be written
+// into the mod file.
+static Attrs getSymbolAttrsToWrite(const Symbol &symbol) {
+  // Is SAVE attribute is implicit, it should be omitted
+  // to not violate F202x C862 for a common block member.
+  return symbol.attrs() & ~(symbol.implicitAttrs() & Attrs{Attr::SAVE});
+}
+
 static llvm::raw_ostream &PutGenericName(
     llvm::raw_ostream &os, const Symbol &symbol) {
   if (IsGenericDefinedOp(symbol)) {
@@ -314,7 +322,7 @@ void ModFileWriter::PutSymbol(
             }
             decls_ << '\n';
             if (symbol.attrs().test(Attr::BIND_C)) {
-              PutAttrs(decls_, symbol.attrs(), x.bindName(),
+              PutAttrs(decls_, getSymbolAttrsToWrite(symbol), x.bindName(),
                   x.isExplicitBindName(), ""s);
               decls_ << "::/" << symbol.name() << "/\n";
             }
@@ -723,7 +731,7 @@ void ModFileWriter::PutObjectEntity(
   }
   PutEntity(
       os, symbol, [&]() { PutType(os, DEREF(symbol.GetType())); },
-      symbol.attrs());
+      getSymbolAttrsToWrite(symbol));
   PutShape(os, details.shape(), '(', ')');
   PutShape(os, details.coshape(), '[', ']');
   PutInit(os, symbol, details.init(), details.unanalyzedPDTComponentInit());

diff  --git a/flang/test/Semantics/modfile58.f90 b/flang/test/Semantics/modfile58.f90
new file mode 100644
index 000000000000000..4c5fac09c07550c
--- /dev/null
+++ b/flang/test/Semantics/modfile58.f90
@@ -0,0 +1,18 @@
+! RUN: %python %S/test_modfile.py %s %flang_fc1
+
+! Test that the implicit SAVE attribute (set
+! for the equivalenced symbols) is not written
+! into the mod file.
+module implicit_save
+  real dx,dy
+  common /blk/ dx
+  equivalence(dx,dy)
+end module implicit_save
+
+!Expect: implicit_save.mod
+!moduleimplicit_save
+!real(4)::dx
+!real(4)::dy
+!common/blk/dx
+!equivalence(dx,dy)
+!end


        


More information about the flang-commits mailing list