[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.
This commit is contained in:
Slava Zakharin 2023-09-25 09:35:43 -07:00 committed by GitHub
parent e7b8e18fc3
commit 1db42fa6f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 2 deletions

View File

@ -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());

View File

@ -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