[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:
Peter Klausler 2025-03-19 12:01:18 -07:00 committed by Tom Stellard
parent 069ef671e0
commit 8272e45161
2 changed files with 8 additions and 1 deletions

View File

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

View File

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