[flang] Exempt construct entities from SAVE check for PURE (#131383)
A PURE subprogram can't have a local variable with the SAVE attribute. An ASSOCIATE or SELECT TYPE construct entity whose selector is a variable will return true from IsSave(); exclude them from the local variable check. Fixes https://github.com/llvm/llvm-project/issues/131356. (cherry picked from commit b99dab25879449cb89c1ebd7b4088163543918e3)
This commit is contained in:
parent
069ef671e0
commit
8272e45161
@ -359,7 +359,10 @@ void CheckHelper::Check(const Symbol &symbol) {
|
||||
// are not pertinent to the characteristics of the procedure.
|
||||
// Restrictions on entities in pure procedure interfaces don't need
|
||||
// enforcement.
|
||||
} else if (!FindCommonBlockContaining(symbol) && IsSaved(symbol)) {
|
||||
} else if (symbol.has<AssocEntityDetails>() ||
|
||||
FindCommonBlockContaining(symbol)) {
|
||||
// can look like they have SAVE but are fine in PURE
|
||||
} else if (IsSaved(symbol)) {
|
||||
if (IsInitialized(symbol)) {
|
||||
messages_.Say(
|
||||
"A pure subprogram may not initialize a variable"_err_en_US);
|
||||
|
@ -36,6 +36,8 @@ module m
|
||||
end subroutine
|
||||
end interface
|
||||
|
||||
real :: moduleVar = 1.
|
||||
|
||||
contains
|
||||
|
||||
subroutine impure(x)
|
||||
@ -117,6 +119,8 @@ module m
|
||||
!ERROR: A pure subprogram may not initialize a variable
|
||||
real :: v6 = 0.
|
||||
end block
|
||||
associate (x => moduleVar) ! ok
|
||||
end associate
|
||||
end subroutine
|
||||
pure subroutine s06 ! C1589
|
||||
!ERROR: A pure subprogram may not have a variable with the VOLATILE attribute
|
||||
|
Loading…
x
Reference in New Issue
Block a user