[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