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

via flang-commits flang-commits at lists.llvm.org
Fri Sep 22 18:15:03 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-semantics

<details>
<summary>Changes</summary>

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.


---
Full diff: https://github.com/llvm/llvm-project/pull/67215.diff


2 Files Affected:

- (modified) flang/lib/Semantics/mod-file.cpp (+10-2) 
- (added) flang/test/Semantics/modfile58.f90 (+18) 


``````````diff
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

``````````

</details>


https://github.com/llvm/llvm-project/pull/67215


More information about the flang-commits mailing list