mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-18 16:58:23 +00:00
[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:
parent
e7b8e18fc3
commit
1db42fa6f0
@ -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());
|
||||
|
18
flang/test/Semantics/modfile58.f90
Normal file
18
flang/test/Semantics/modfile58.f90
Normal 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
|
Loading…
x
Reference in New Issue
Block a user